Description
Input
Output
Sample Input
1
3 3
1 2 3
1 3 4
2 3 5
Sample Output
Scenario #1:
4
题目大意:有n个城市,m条道路,在每条道路上有一个承载量(道路双向),现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量
思路:Dijkstra 变形, dis[i] 表示城市1到城市i的最大承载量. 更新条件:
dis[next] = max( dis[next] , min( dis[now] , mpt[now][next] ) )
也可以用最大生成树来做.
Dijkstra:
#include <stdio.h> #include <string.h> #include <math.h> #define INF 99999999 int mpt[1010][1010]; int dis[1010]; int visit[1010]; int Min1(int a,int b) { if( a < b)return a; return b; } void Dijkstra(int x,int n) { int i,j; for(i = 1; i <= n ; i ++) dis[i] = mpt[x][i]; memset(visit,0,sizeof(visit)); visit[x] = 1; for(i = 1; i < n ; i ++) { int Max = -1; int Maxj = -1; for(j = 1; j <= n ; j ++) { if(visit[j]) continue; if( Max < dis[j]) { Max = dis[j]; Maxj = j; } } if(Maxj == -1)continue; visit[Maxj] = 1; for(j = 1; j <= n ; j ++) { if(dis[j] < Min1(dis[Maxj],mpt[Maxj][j])) dis[j] = Min1(dis[Maxj],mpt[Maxj][j]); } } } int main() { int n,m,i,j,Case = 1,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i = 1; i <= n ; i ++) { for(j = 1; j <= n ; j ++) { if( i == j ) mpt[i][j] = INF; else mpt[i][j] = -1; } } int u,v,len; for(i = 0 ; i < m ; i++) { scanf("%d %d %d",&u,&v,&len); if(mpt[u][v] < len) { mpt[u][v] = len; mpt[v][u] = len; } } Dijkstra(1,n); printf("Scenario #%d:\n%d\n\n",Case++,dis[n]); } return 0; }