HDU1102

除了题面没说多组数据比较坑以外,别的就是裸mst

已经建的路直接节点合并即可

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 struct node{
 5     int from,to,w;
 6     bool operator < (const node & a){
 7         return w<a.w;
 8     }
 9 }a[10001];
10 int f[101],d[101][101];
11 int n,w,m=0,ans=0,u,v,t;
12 
13 void ini(){
14     for (int i=1;i<=n;i++) f[i]=i;
15     m=ans=0;
16 }
17 
18 int getf(int u){
19     return f[u]==u?f[u]:f[u]=getf(f[u]);
20 }
21 
22 void merge(int u,int v){
23     f[getf(u)]=getf(v);
24 }
25 
26 void solve()
27 {
28     while (cin>>n){
29         ini();
30         for (int i=1;i<=n;i++){
31             for (int j=1;j<=n;j++){
32                 cin>>d[i][j];
33                 a[++m]={i,j,d[i][j]};
34             }
35         }
36         cin>>t;
37         for (int i=1;i<=t;i++){
38             cin>>u>>v;
39             merge(u,v);
40         }
41         sort(a+1,a+1+m);
42         for (int i=1;i<=m;i++){
43             if (getf(a[i].from)!=getf(a[i].to)){
44                 ans+=a[i].w;
45                 merge(a[i].from,a[i].to);
46             }
47         }
48         cout<<ans<<endl;
49     }
50 }
51 
52 int main()
53 {
54     solve();
55     return 0;
56 }

 

posted @ 2020-04-28 18:22  White_Li  阅读(124)  评论(0)    收藏  举报