1349:【例4-10】最优布线问题
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 }
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 }