3 3 0 2 0 2 5 0 1 4 1 2 2
6 1
参考代码:
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const int MAXN=52;
struct point
{
int pos,cost, ismin;
bool operator < (const point &p) const//每次从优先队列中取出集合中最短路最大的点
{
if(p.cost!=cost)
return p.cost<cost;
return p.pos<pos;
}
point(int pos,int cost,int ismin)
{
this->pos=pos;
this->cost=cost;
this->ismin=ismin;
}
};
int n,m,s,e,mincost[MAXN][3],dp[MAXN][3],edge[MAXN][MAXN];
bool used[MAXN][3];
void SPFA()
{
memset(mincost,INF,sizeof(mincost));
memset(dp,0,sizeof(dp));
memset(used,false,sizeof(used));
priority_queue<point>q;//优先队列
mincost[s][1]=0;
dp[s][1]=1;
q.push(point(s,0,1));
while(!q.empty())
{
point now=q.top();
q.pop();
if(used[now.pos][now.ismin])continue;
used[now.pos][now.ismin]=true;
for(int i=0; i<n; i++)
{
if(edge[now.pos][i]==INF)
continue;
if(!used[i][1]&&now.cost+edge[now.pos][i]<mincost[i][1])//从当前点出发到达i的某条路的长度比到达i点的最短路短
{
mincost[i][2]=mincost[i][1];//更新次短路
dp[i][2]=dp[i][1];
q.push(point(i,mincost[i][2],2));
mincost[i][1]=now.cost+edge[now.pos][i];//更新最短路
dp[i][1]=dp[now.pos][now.ismin];
q.push(point(i,mincost[i][1],1));
}
else if(!used[i][1]&&now.cost+edge[now.pos][i]==mincost[i][1])//从当前点出发到达i的某条路的长度与到达i点的最短路的长度一致
{
dp[i][1]+=dp[now.pos][now.ismin];
}
else if(!used[i][2]&&now.cost+edge[now.pos][i]<mincost[i][2])//从当前点出发到达i的某条路的长度与到达i点的最短路长,但同时比次短路短
{
mincost[i][2]=now.cost+edge[now.pos][i];
dp[i][2]=dp[now.pos][now.ismin];
q.push(point(i,mincost[i][2],2));
}
else if(!used[i][2]&&now.cost+edge[now.pos][i]==mincost[i][2])//从当前点出发到达i的某条路的长度与到达i点的最次路的长度一致
{
dp[i][2]+=dp[now.pos][now.ismin];
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
while(scanf("%d%d%d%d",&n,&m,&s,&e)!=EOF)
{
memset(edge,INF,sizeof(edge));
for(int i=1; i<=m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
edge[a][b]=c;//有向图
}
SPFA();
printf("%d %d\n",mincost[e][2],dp[e][2]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 3191 How Many Paths Are There(SPFA)
原文:http://blog.csdn.net/noooooorth/article/details/47319347