BNUOJ-20950-沉重的货物(最小生成树的Prim算法)
来源:互联网 发布:手机淘宝怎么发帖 编辑:程序博客网 时间:2024/05/16 14:52
E. 沉重的货物
Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld Java class name: Main
Submit Status PID: 20950
CUITCPC是一个专门生产大型货运火车的工厂。他们的新型货运火车XX V1.0,是如此之大,以至于可以运输的货物的重量并不取决于那个火车本身,而只是受限于你所通过的铁路的承重。
给你出发和目标城市,你的任务就是求出火车从初始城市到目标城市的最大载重。
Input
输入可能包括一组或者多组测试数据。每一个测试数据的前两行是两个整数:城市的数量n(2<=n<=1000)和铁路的条数r(1<=r<= 19900)。
紧接着是r行,每一行描述一条连接两个城市的铁路以及这段铁路所能承受的最大重量。城市名不会超过30个字符,也不会有空白字符出现在城市名中。承重是一个0-10000的整数。铁路都是双向的。
最后一行是两个城市的名字:初始城市和目标城市。
输入的结束条件是n和r都为0
Output
对于每一组测试数据
输出包括3行:
l 一行输出”Scenario #x”,其中x是测试数据的组数
l 一行输出”y tons”,其中y表示最大载重量
l 一个空行
Sample Input
4 3
ACM ICPC 100
ICPC World 80
World CPC 120
ACM CPC
5 5
ACM ICPC 100
ICPC World 80
World CPC 120
ACM Chengdu 220
Chengdu CPC 170
CPC ACM
0 0
Sample Output
Scenario #1
80 tons
Scenario #2
170 tons
从起点的顶点开始,往集合内添加较大的边,直到遇见终点结束,输出集合内最小的边即可
代码
#include<iostream>#include<cstring>#include<string>#include<map>using namespace std;const int INF=0x3fffffff;const int N=1005;int n;//城市数量int m;//铁路数量int min_num;//最大载重集合中的最小载重int mapn[N][N];int dis[N];int vis[N];//已访问标记为1,初始化为0void Prim(int s,int e)//最小生成树的普利姆算法{ int i, j; memset(vis,0,sizeof(vis));//初始化为未访问 memset(dis,-1,sizeof(dis)); for(i=1; i<=n; i++) if(mapn[s][i]!=-INF) dis[i]=mapn[s][i]; vis[s]=1;//标记为已访问 for(i=1; i<n; i++) { int mmax=-1,pos; for(j=1; j<=n; j++) if(!vis[j]&&dis[j]>mmax) mmax=dis[pos=j]; if(mmax==-1) break; min_num=min_num<mmax?min_num:mmax; if(pos==e) break; vis[pos]=1; for(j = 1; j<=n; j++) if(!vis[j]&&mapn[pos][j]>dis[j]) dis[j]=mapn[pos][j]; }}int main(){ int casen=1;//第casene组数据 map<string,int> mp; string str1,str2; while(scanf("%d%d",&n,&m)&&n&&m)//城市数量和铁路数量 { min_num=INF;//初始化最大载重集合中的最小载重 mp.clear();//清空mp for(int i=0; i<=n; i++)//初始化mapn for(int j=0; j<=n; j++) mapn[i][j]=-INF; int flag=1; for(int i=0; i<m; i++) { int w;//载重 cin>>str1>>str2>>w; if(mp.find(str1)==mp.end()) mp[str1]=flag++; if(mp.find(str2)==mp.end()) mp[str2]=flag++; int x=mp[str1],y=mp[str2]; mapn[x][y]=mapn[y][x]=w; } cin>>str1>>str2; Prim(mp[str1],mp[str2]); printf("Scenario #%d\n",casen++); printf("%d tons\n\n",min_num); } return 0;}
- BNUOJ-20950-沉重的货物(最小生成树的Prim算法)
- bnuoj 20950 沉重的货物 (最小生成树)
- bnuoj 20950 沉重的货物 (最小生成树)
- Prim 算法生成的最小生成树
- 最小生成树的prim算法代码
- 最小生成树的prim算法实现
- 构造最小生成树的 prim 算法
- 最小生成树的Prim算法
- 图的最小生成树(prim算法)
- 最小生成树的prim算法
- 最小生成树的prim算法
- JAVA的最小生成树(prim)算法
- 最小生成树的prim算法实现
- 最小生成树的prim算法
- 最小生成树的Prim算法
- 最小生成树的Prim算法笔记
- 求最小生成树的Prim算法
- 最小生成树的prim算法
- 位段那些事
- 知乎几条不错的想法
- [布局效率问题]解决ListView的getview调用次数多于子view个数的问题
- CodeForces 628A Tennis Tournament
- C++第五次上机实验
- BNUOJ-20950-沉重的货物(最小生成树的Prim算法)
- 百钱买百鸡最优解
- CodeForces 628B New Skateboard
- Android中短信的收发
- 《深入浅出JavaScript(中文版)》读后记录
- 【问题】sql数据库安装重启失败
- c++上机作业5
- 获取select option自定义元素的值
- 两端输出字符,从两端移动向中间汇聚; 模拟三次密码输入