链接地址:http://poj.org/problem?id=3615
题意简单。给你一个有向图,然后给你一些起点s和终点e,问s到e的所有路径中经过的边的边权值最大的最小的是多少。若s到e不可达则输出-1。
用floyd算法可以解决掉。不过要修改一下。
Accepted 528K 532MS C 险过~
code:
#include <stdio.h> #include <string.h> #define MAXN 305 #define INF 0x7f7f7f7f int d[MAXN][MAXN]; void floyd(int n) { int i, j, k, tmp; for(k=1; k<=n; k++) for(i=1; i<=n; i++) for(j=1; j<=n; j++) if(d[i][k]<INF&&d[k][j]<INF) { if(d[i][k]>d[k][j]) tmp = d[i][k]; else tmp = d[k][j]; if(d[i][j]==INF) { d[i][j] = tmp; // d[i][j] = max(d[i][k],d[k][j]); } else if(tmp<d[i][j]) d[i][j] = tmp; // d[i][j] = min( d[i][j], max(d[i][k],d[k][j]) ); } } int main() { int N, M, T, i, v, u, len, s, e; while(~scanf("%d%d%d",&N,&M,&T)) { memset(d,INF,sizeof(d)); for(i=0; i<M; i++) { scanf("%d%d%d",&v,&u,&len); d[v][u] =len; } floyd(N); for(i=0; i<T; i++) { scanf("%d%d",&s,&e); if(d[s][e]==INF) printf("-1\n"); else printf("%d\n",d[s][e]); } } return 0; }