uva544

25 篇文章 0 订阅
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int m,n,t;
int e,b;
int map_ [210][210];
bool vis[210];
int dis[210];
map <string,int> ma;
void dj()
{
   for(int i=1;i<=n;i++) dis[i]=map_[b][i];
   dis[b]=0;
   vis[b]=1;
   for(int i=0;i<n;i++)
   {
       int temp=-1;
       int v=-1;
       for(int j=1;j<=n;j++)
       {
           if(temp<dis[j] && !vis[j])
           {
               temp=dis[j];
               v=j;
           }
       }
       if(v==-1) return ;
       vis[v]=1;
       for(int j=1;j<=n;j++)
        if(!vis[j] && map_[v][j] && dis[j]<min(dis[v],map_[v][j]))
            dis[j]=min(dis[v],map_[v][j]);
   }
}
int main()
{
    int count_=0;
    while(cin>>n>>m && !(n==0 && m==0))
    {
        t=1;
        count_++;
        ma.clear();
        memset(map_,0,sizeof(map_));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<m;i++)
            {
                string s1,s2;
                int ton;
                cin>>s1;
                if(!ma.count(s1))
                ma[s1]=t++;
                cin>>s2;
                if(!ma.count(s2))
                    ma[s2]=t++;
                cin>>ton;
                int x=ma[s1];
                int y=ma[s2];
                map_[x][y]=ton;
                map_[y][x]=ton;
            }
        string s1,s2;
        cin>>s1>>s2;
        b=ma[s1];
        e=ma[s2];
        dj();
        cout<<"Scenario #"<<count_<<endl<<dis[e]<<" tons"<<endl<<endl;
    }
    return 0;
}

kruskal版本:

#include <cstdio>  
#include <cstring>  
#include <string>  
#include <map>  
#include <iostream>  
#include <algorithm>  
using namespace std;  

const int N = 205;  
const int M = 20005;  

map<string, int> hash;  
string a, b;  
int hn;  

int get(string a) {  
    if (!hash.count(a)) hash[a] = hn++;  
    return hash[a];  
}  

struct Edge {  
    int u, v, val;  
    void read() {  
        cin >> a >> b >> val;  
        u = get(a); v = get(b);  
    }  
} e[M];  

bool cmp(Edge a, Edge b) {  
    return a.val > b.val;  
}  

int n, m, parent[N];  

int find(int x) {  
    return x == parent[x] ? x : parent[x] = find(parent[x]);  
}  

int main() {  
    int cas = 0;  
    while (~scanf("%d%d", &n, &m) && n || m) {  
        string a, b, val;  
        hash.clear(); hn = 1;  
        for (int i = 1; i <= n; i++) parent[i] = i;  
        for (int i = 0; i < m; i++) e[i].read();  
        sort(e, e + m, cmp);  
        cin >> a >> b;  
        int ss = get(a), ee = get(b);  
        for (int i = 0; i < m; i++) {  
            int pu = find(e[i].u);  
            int pv = find(e[i].v);  
            if (pu != pv) {  
                parent[pu] = pv;  
                if (find(ss) == find(ee)) {  
                    printf("Scenario #%d\n", ++cas);  
                    printf("%d tons\n\n", e[i].val);  
                    break;  
                }  
            }  
        }  
    }  
    return 0;  
} 

利用kruskal性质把边从大到小加入,然后一旦连通就结束输出答案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值