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性质把边从大到小加入,然后一旦连通就结束输出答案
阅读全文
0 0