http://poj.org/problem?id=3463
题意 给出一个图 若次短路比最短路多1 则输出 最短路的条数+次短路的条数
否则输出 最短路的条数
#include<iostream> #include<stdio.h> #include<queue> #include<string.h> using namespace std; #define INF 100000000 struct E{int to;int next;int len;}edge[20004]; int vis[1014][2],d[1012][2],dp[1012][2],adj[1002],num; void dij(int s,int n) { int i,j,flag; memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) d[i][0]=d[i][1]=INF; d[s][0]=0; dp[s][0]=1; //vis[s][0]=1; for(i=1;i<2*n;i++) { int minn=INF,a,b; for(j=1;j<=n;j++) { if(!vis[j][0]&&minn>d[j][0]) { minn=d[j][0]; a=j; flag=0; } if(!vis[j][1]&&minn>d[j][1]) { minn=d[j][1]; a=j;flag=1; } } if(minn==INF) break; vis[a][flag]=1; //printf("ok"); for(j=adj[a];j!=0;j=edge[j].next ) { b=edge[j].to ; int v=edge[j].len; if(d[a][flag]+v<d[b][0]) { d[b][1]=d[b][0]; dp[b][1]=dp[b][0]; d[b][0]=minn+v; dp[b][0]=dp[a][flag]; } else if(minn+v==d[b][0]) dp[b][0]+=dp[a][flag]; else if(minn+v<d[b][1]) { d[b][1]=d[a][flag]+v; dp[b][1]=dp[a][flag]; } else if(d[a][flag]+v==d[b][1]) dp[b][1]+=dp[a][flag]; } } } void add(int a,int b,int c) { edge[num].to =b; edge[num].next =adj[a]; edge[num].len=c; adj[a]=num++; } int main() { int i,j,m,n,t,a,b,c,s,e; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(adj,0,sizeof(adj)); num=1; while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } scanf("%d%d",&s,&e); dij(s,n); if(d[e][0]+1==d[e][1]) dp[e][0]+=dp[e][1]; printf("%d ",dp[e][0]); } return 0; }