最短路问题,要求出最短路的个数。
输出一条得到JavaBean最多的最短路径
#include<stdio.h> #include<string.h> #define inf 0x3fffffff int n,m,map[510][510],dp[510],mark[510],dis[510],w[510],pre[510],link[510]; int st,ed; void dijkstra() { int i,j,k,min; memset(mark,0,sizeof(mark));//标记房间是否走过 memset(dp,0,sizeof(dp));//记录到达位置得到最多的JavaBean memset(pre,-1,sizeof(pre));//记录到达此房间的前一个房间 memset(link,0,sizeof(link));//记录到达此位置最短路的个数 for(i=0;i<n;i++) dis[i]=inf;//距离起点的最短距离 dis[st]=0; link[st]=1; dp[st]=w[st]; for(i=0;i<n;i++) { min=inf;k=-1; for(j=0;j<n;j++) { if(!mark[j]&&min>dis[j]) { min=dis[j]; k=j; } } mark[k]=1; for(j=0;j<n;j++) { if(mark[j]||dis[j]<dis[k]+map[k][j]||map[k][j]==inf)continue; if(dis[j]==dis[k]+map[k][j])//如果从k到达j的距离与j的最小距离相等 link[j]+=link[k];//j的最短路数要加上k的 else link[j]=link[k];//如果从k到达j的路短的话,到达j的最短路数就等于k的最短路数 if(dis[j]>dis[k]+map[k][j]||dp[j]<dp[k]+w[j])//路径更短或者路劲相等得到的JavaBean更多 { dis[j]=dis[k]+map[k][j]; pre[j]=k; dp[j]=dp[k]+w[j]; } } } } void prit(int u) { if(u==st){printf("%d",st);return;} prit(pre[u]); printf(" %d",u); } int main() { int i,j,x,y,p; while(scanf("%d%d%d%d",&n,&m,&st,&ed)!=-1) { for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]=inf; for(i=0;i<n;i++) scanf("%d",&w[i]); for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&p); if(map[x][y]>p) map[x][y]=map[y][x]=p; } dijkstra(); printf("%d %d\n",link[ed],dp[ed]); prit(ed); printf("\n"); } return 0; }
5 10 0 2
1 2 1 5 3
0 1 2
0 2 4
0 3 3
0 4 1
1 2 2
1 3 1
1 4 1
2 3 1
2 4 3
3 4 2