UVA 10525

过了这道AC率较低的题,得意下— —

这题是最短路径问题,但是比较的是最短时间,时间相同的时候再比较最短路径

用bellman-ford带上改过的relax函数就可以了,但是这样还不够

论坛上看到帖子说可能一条路被报告2次,应该选择路程(时间)较小的值

之后就AC了

估计不少人是栽在这个问题上

 

 

#include<stdio.h> #include<string.h> int dis[60][60],tm[60][60],n,m,sd[60],st[60],edge[30][2]; inline int min(int a,int b) {return a<b?a:b;} void input() { scanf("%d%d",&n,&m); int a,b,c,d; memset(dis,-1,sizeof(dis)); memset(tm,-1,sizeof(tm)); for(int i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(tm[a][b]==-1) { tm[a][b]=tm[b][a]=c; dis[a][b]=dis[b][a]=d; edge[i][0]=a; edge[i][1]=b; }else { dis[a][b]=dis[b][a]=min(d,dis[a][b]); tm[a][b]=tm[b][a]=min(c,tm[a][b]); edge[i][0]=a; edge[i][1]=b; } } } bool relax(int a,int b) { if(st[a]>st[b]+tm[a][b]) { st[a]=st[b]+tm[a][b]; sd[a]=sd[b]+dis[a][b]; return true; }else if(st[b]>st[a]+tm[a][b]) { st[b]=st[a]+tm[a][b]; sd[b]=sd[a]+dis[a][b]; return true; }else if(st[a]==st[b]+tm[a][b]) { if(sd[a]>sd[b]+dis[a][b]) { sd[a]=sd[b]+dis[a][b]; return true; } }else if(st[b]==st[a]+tm[a][b]) { if(sd[b]>sd[a]+dis[b][a]) { sd[b]=sd[a]+dis[b][a]; return true; } } return false; } void bellman_ford(int source) { memset(sd,0x11,sizeof(sd)); memset(st,0x11,sizeof(st)); sd[source]=0; st[source]=0; bool changed=true; while(changed) { // putchar('!'); changed=false; for(int i=0;i<m;i++) if(relax(edge[i][0],edge[i][1])) changed=true; } } void solve() { int t,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); bellman_ford(a); if(st[b]==0x11111111)printf("No Path./n"); else printf("Distance and time to reach destination is %d & %d./n",sd[b],st[b]); } } int main() { int times; scanf("%d",×); while(times--) { input(); solve(); if(times)putchar(10); } }  

你可能感兴趣的:(c,input,distance)