标签:
Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
题解:求所有1到n的路径中能运的最大值,用djistra算法,每次找最大的一个,然后更新该点到其他点的最大值。(有的题目是求所有路径中的最大值)。
djistra:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int INF = 0x3fffffff; int map[1003][1003]; bool visited[1003]; int d[1003]; //保存1到该点路径中运输量的最大值 int min(int a,int b) { return a > b ? b : a; } void prim(int n) { memset(visited,false,sizeof(visited)); for(int i = 1;i <= n;i++) { d[i] = map[1][i]; } d[1] = INF; visited[1] = true; for(int i = 1;i < n;i++) { int m = 0; int k; for(int j = 1;j <= n;j++) { if(!visited[j] && m < d[j]) //每次找到j点运输量最大的一个 { m = d[j]; k = j; } } if(m == 0) { break; } visited[k] = true; for(int j = 1;j <= n;j++) { if(!visited[j] && d[j] < map[k][j] && d[j] < d[k]) { //表示1到j的路径的运输量的最大值被1->k->j取代,因为该路径的大 d[j] = min(d[k],map[k][j]); } } } } int main() { int ncase; cin>>ncase; int t = 1; while(ncase--) { int n,m; scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { if(i == j) { map[i][j] = INF; //自己运输到自己 } else { map[i][j] = 0; } } } for(int i = 0;i < m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); map[u][v] = map[v][u] = w; } prim(n); printf("Scenario #%d:\n",t++); printf("%d\n\n",d[n]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wang2534499/article/details/47761319