1349:【例4-10】最优布线问题

和1350是同一个题

地址:http://ybt.ssoier.cn:8088/problem_show.php?pid=1349

Prim代码:

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 
 5 int n,u,ans;
 6 int mp[105][105];//图(邻接矩阵) 
 7 int d[105];//最短距离 
 8 bool vis[105];//访问标记 
 9 
10 void prim(){//核心代码 
11     for(int i=1;i<=n;i++){
12         d[i]=INF;
13     }
14     d[1]=0;
15     for(int i=1;i<=n;i++){
16         int u=-1,MIN=INF;
17         for(int j=1;j<=n;j++){
18             if(vis[j]==0 && d[j]<MIN){
19                 u=j;
20                 MIN=d[j];
21             }
22         }
23         vis[u]=1;
24         ans+=d[u];
25         for(int v=1;v<=n;v++){
26             if(vis[v]==0 && mp[u][v]!=INF && mp[u][v]<d[v]){
27                 d[v]=mp[u][v];
28             }
29         }
30     }
31 }
32 
33 int main(){
34     cin>>n;
35     for(int i=1;i<=n;i++){
36         for(int j=1;j<=n;j++){
37             cin>>mp[i][j];
38         }
39     }
40     prim();
41     cout<<ans;
42     return 0;
43 }

Kruskal代码:

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 
 5 int n,m,num,sum;
 6 bool boo[105][105];
 7 struct edge{
 8     int a,b,c;
 9 }mp[90005];
10 
11 bool cmp(edge a,edge b){
12     return a.c<b.c;
13 }
14 
15 int father[305];
16 int findfather(int x){
17     if(father[x]!=x) father[x]=findfather(father[x]);
18     else return father[x];
19 }
20 
21 void kruskal(int n,int m){
22     num=0;
23     for(int i=1;i<=n;i++){
24         father[i]=i;
25     }
26     sort(mp+1,mp+m+1,cmp);
27 //    for(int i=1;i<=m;i++) cout<<mp[i].a<<" "<<mp[i].b<<endl;
28     for(int i=1;i<=m;i++){
29         if(findfather(mp[i].a)!=findfather(mp[i].b)){
30             father[findfather(mp[i].a)]=findfather(mp[i].b);
31             num++;
32             sum+=mp[i].c;
33             if(num==n-1) break;
34         }
35     }
36 }
37 
38 int main(){
39     cin>>n;
40     int m=pow(n,2);
41     int k=0;
42     for(int i=1;i<=n;i++){
43         for(int j=1;j<=n;j++){
44             int temp;
45             cin>>temp;        
46             if(boo[i][j]==0 && i!=j){
47                 k++;
48                 mp[k].a=i;
49                 mp[k].b=j;
50                 mp[k].c=temp;
51                 boo[j][i]=1;
52                 if(temp==0) mp[k].c=INF;                
53             }
54         }
55     }
56     kruskal(n,k);
57     cout<<sum;
58     return 0;
59 }
原文地址:https://www.cnblogs.com/Wag-Ho/p/14640441.html