最大生成树+map实现技巧
1 //#include<bits/stdc++.h> 2 #include<iostream> 3 #include<cstdio> 4 #include<algorithm> 5 #include<vector> 6 #include<cstring> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<bitset> 11 #include<utility> 12 #include<functional> 13 #include<iomanip> 14 #include<sstream> 15 #include<ctime> 16 #include<cassert> 17 #define fi first 18 #define se second 19 #define mp make_pair 20 #define pb push_back 21 #define pw(x) (1ll << (x)) 22 #define sz(x) ((int)(x).size()) 23 #define all(x) (x).begin(),(x).end() 24 #define rep(i,l,r) for(int i=(l);i<(r);i++) 25 #define per(i,r,l) for(int i=(r);i>=(l);i--) 26 #define FOR(i,l,r) for(int i=(l);i<=(r);i++) 27 #define debug1(a) cout << #a << " = " << a << endl; 28 #define debug2(a,b) cout << #a << " = " << a << endl;\ 29 cout << #b << " = " << b << endl; 30 #define debug3(a,b,c) cout << #a << " = " << a << endl;\ 31 cout << #b << " = " << b << endl;\ 32 cout << #c << " = " << c << endl; 33 #define debug4(a,b,c,d)\ 34 cout << #a << " = " << a << endl;\ 35 cout << #b << " = " << b << endl;\ 36 cout << #c << " = " << c << endl;\ 37 cout << #d << " = " << d << endl; 38 #define eps 1e-9 39 #define PIE acos(-1) 40 #define cl(a,b) memset(a,b,sizeof(a)) 41 #define fastio ios::sync_with_stdio(false);cin.tie(0); 42 #define lson l , mid , ls 43 #define rson mid + 1 , r , rs 44 #define ls (rt<<1) 45 #define rs (ls|1) 46 #define INF 0x3f3f3f3f 47 #define lowbit(x) (x&(-x)) 48 #define sqr(a) a*a 49 #pragma GCC optimize(2) 50 using namespace std; 51 typedef double db; 52 typedef long long ll; 53 typedef vector<int> vi; 54 typedef pair<int, int> pii; 55 56 57 58 const int maxn=2e5; 59 int u[maxn],v[maxn],w[maxn],p[maxn],r[maxn]; 60 int n,m,cnt; 61 map<string,int>MAP; 62 63 64 int cmp(const int i,const int j){return w[i]>w[j];} 65 int find(int x){return p[x]==x?x:p[x]=find(p[x]);} 66 int kruscal(int t1,int t2) 67 { 68 int ans=0; 69 rep(i,0,maxn)p[i]=r[i]=i; 70 sort(r,r+m,cmp); 71 rep(i,0,m){ 72 int e=r[i]; 73 int x=find(u[e]); 74 int y=find(v[e]); 75 if(x!=y){ 76 p[x]=y; 77 if(find(t1)==find(t2)){ 78 ans=w[e]; 79 return ans; 80 } 81 } 82 } 83 return w[r[m]]; 84 } 85 void Init() 86 { 87 MAP.clear(); 88 cnt=0; 89 } 90 int main() 91 { 92 int cas=0; 93 while(cin>>n>>m,n&&m){ 94 Init(); 95 char s1[50],s2[50]; 96 rep(i,0,m){ 97 scanf("%s%s%d",s1,s2,&w[i]); 98 if(!MAP.count(s1))MAP[s1]=cnt++; 99 if(!MAP.count(s2))MAP[s2]=cnt++; 100 u[i]=MAP[s1]; 101 v[i]=MAP[s2]; 102 // debug3(MAP[s1],MAP[s2],w[i]); 103 } 104 scanf("%s%s",s1,s2); 105 printf("Scenario #%d\n", ++cas); 106 printf("%d tons\n\n", kruscal(MAP[s1],MAP[s2])); 107 // printf("Scenario #%d\n%d tons\n\n",++cas,kruscal(MAP[s1],MAP[s2])); 108 } 109 return 0; 110 }