这道题纠结了好久,很郁闷,还是题目没读好!
要求的是,找出路径最短的,豆子最多的。参考党的,用了两个DIJ,刚开始我试着用一个DIJ,很纠结也没弄出来,哎。
我悲剧的最短路径,还有五道题呀。。。我晕
#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <limits.h> #define N 520 int n,m,start,end; int bean[N],map[N][N],path[N]; void input() { int i,j,from,to,len; for(i=0; i<n; i++) for(j=0; j<n; j++) map[i][j] = INT_MAX; for(i=0; i<n; i++) scanf("%d",&bean[i]); for(i=0; i<m; i++) { scanf("%d%d%d",&from,&to,&len); if( map[from][to] > len ) map[from][to] = map[to][from] = len; } } void dijkstra() { int hash[N],temp,now,i,j,min,dis[N],beansum[N],pathsum[N]; memset(hash,0,sizeof(hash)); for(i=0; i<n; i++) dis[i] = INT_MAX; now = start; dis[now] = 0; hash[now] = 1; for(i=0; i<n; i++) // dij第一次 { for(j=0; j<n; j++) if( !hash[j] && map[now][j]!=INT_MAX && dis[j] > dis[now] + map[now][j] ) { dis[j] = dis[now] + map[now][j]; } min = INT_MAX; for(j=0; j<n; j++) if( !hash[j] && dis[j] < min ) min = dis[now = j]; hash[now] = 1; } for(i=0; i<n; i++) { hash[i] = beansum[i] = pathsum[i] = 0; } dis[now = start] = 0; hash[now] = pathsum[now] = 1; beansum[start] = bean[start]; for(i=0; i<n; i++) // dij第二次 { for(j=0; j<n; j++) if(!hash[j] && dis[j] == dis[now] + map[now][j] ) { pathsum[j] += pathsum[now]; temp = beansum[now] + bean[j]; if( temp > beansum[j] ) { beansum[j] = temp; path[j] = now; } } min = INT_MAX; for(j=0; j<n; j++) if( !hash[j] && dis[j] < min ) min = dis[now = j]; hash[now] = 1; } printf("%d %d/n",pathsum[end],beansum[end]); } void output(int end) { if( end == start ) { printf("%d",start); return; } output(path[end]); printf(" %d",end); } int main(void) { while( scanf("%d%d%d%d",&n,&m,&start,&end)!=EOF ) { input(); dijkstra(); output(end); printf("/n"); } system("pause"); return 0; }