BNUOJ-20950-沉重的货物(最小生成树的Prim算法)

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,初始化为0
void 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;
}

你可能感兴趣的:(最小生成树,Prim)