uva544

来源:互联网 发布:淘宝订单险怎么关闭 编辑:程序博客网 时间:2024/05/16 11:26
#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性质把边从大到小加入,然后一旦连通就结束输出答案

原创粉丝点击