忠诚的告诉大家:uva上的题目一定要看清楚格式啊,格式错误也是WA啊,~~~~(>_<)~~~~ 因为一个换行符WA了几次。。。
Dijkstra的变形。。。求一条路上的最小值然后取多条路中的最大值。。。
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int g[110][110]; 6 int v[110],d[110]; 7 int N,R; 8 int start,end,per; 9 int cas; 10 11 bool init() 12 { 13 scanf("%d%d",&N,&R); 14 if(N == 0&&R == 0) 15 return false; 16 17 memset(v,false,sizeof(v)); 18 memset(g,-1,sizeof(g)); 19 20 for(int i = 0;i < R;i ++) 21 { 22 int a,b,w; 23 scanf("%d%d%d",&a,&b,&w); 24 g[a][b] = g[b][a] = w; 25 g[a][a] = g[b][b] = 0; 26 } 27 scanf("%d%d%d",&start,&end,&per); 28 29 return true; 30 } 31 32 void solve() 33 { 34 memset(d,-1,sizeof(d)); 35 d[start] = 0; 36 37 for(int i = 1;i <= N;i ++) 38 { 39 int x = 0,k; 40 for(int j = 1;j <= N;j ++) 41 { 42 if(!v[j] && d[j] > -1&&d[j] >= x) 43 { 44 x = d[k = j]; 45 } 46 } 47 48 v[k] = true; 49 for(int j = 1;j <= N;j ++) 50 { 51 if(k == start) 52 { 53 d[j] = g[k][j]; 54 } 55 else 56 if(g[k][j] > -1&&j != k) 57 { 58 int t = std::min(x,g[k][j]); 59 60 d[j] = std::max(d[j],t); 61 } 62 } 63 } 64 65 int ans = (per%(d[end]-1) == 0?per/(d[end]-1):(per/(d[end]-1) + 1)); 66 printf("Scenario #%d\nMinimum Number of Trips = %d\n\n",cas ++,ans); 67 } 68 69 int main() 70 { 71 cas = 1; 72 while(init()) 73 { 74 solve(); 75 } 76 77 return 0; 78 }