和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 }