二维dijkstra,看别人的解题思路的,一目了然。 http://hi.baidu.com/ofeitian/blog/item/f18a8e3fd252203171cf6c63.html #include<iostream> #include<queue> using namespace std; #define N 1005 #define inf 1000005 struct node { int v,flag,cost; }; struct cmp{ bool operator()(node a,node b){ return a.cost>b.cost; } }; priority_queue<node,vector<node>,cmp>que; struct edge { int v,d; edge *next; }; edge *g[N]; int cnt[N][2],dp[N][2]; bool vis[N][2]; void dijkstra(int s,int n) { int i,flag,cost,v,u,d; node a,temp; memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); for(i=1;i<=n;i++) dp[i][0]=dp[i][1]=inf; dp[s][0]=0; cnt[s][0]=1; while(!que.empty()) que.pop(); a.cost=a.flag=0; a.v=s; que.push(a); while(!que.empty()) { a=que.top(); que.pop(); flag=a.flag,cost=a.cost,v=a.v; if(vis[v][flag]) continue; vis[v][flag]=1; for(edge *ptr=g[v];ptr;ptr=ptr->next) { u=ptr->v,d=ptr->d; if(cost+d<dp[u][0]&&!vis[u][0]) { dp[u][1]=dp[u][0]; cnt[u][1]=cnt[u][0]; temp.cost=dp[u][1]; temp.flag=1; temp.v=u; que.push(temp); dp[u][0]=cost+d; cnt[u][0]=cnt[v][flag]; temp.cost=dp[u][0]; temp.flag=0; temp.v=u; que.push(temp); } else if(cost+d==dp[u][0]) cnt[u][0]+=cnt[v][flag]; else if(cost+d<dp[u][1]&&!vis[u][1]) { dp[u][1]=cost+d; cnt[u][1]=cnt[v][flag]; temp.cost=dp[u][1]; temp.flag=1; temp.v=u; que.push(temp); } else if(cost+d==dp[u][1]) cnt[u][1]+=cnt[v][flag]; } } } void add_edge(int u,int v,int d) { edge *ptr=new edge; ptr->v=v; ptr->d=d; ptr->next=g[u]; g[u]=ptr; return ; } int main() { int n,m,a,b,d,s,e,ca,i; scanf("%d",&ca); while(ca--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) g[i]=NULL; for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&d); add_edge(a,b,d); } scanf("%d%d",&s,&e); dijkstra(s,n); if(dp[e][0]+1==dp[e][1]) printf("%d/n",cnt[e][0]+cnt[e][1]); else printf("%d/n",cnt[e][0]); } return 0; }