1. 程式人生 > >DS圖--最小生成樹

DS圖--最小生成樹

題目描述

根據輸入建立無向網。分別用Prim演算法和Kruskal演算法構建最小生成樹。(假設:輸入資料的最小生成樹唯一。)

輸入

頂點數n

n個頂點

邊數m

m條邊資訊,格式為:頂點1 頂點2 權值

Prim演算法的起點v

輸出

輸出最小生成樹的權值之和

對兩種演算法,按樹的生長順序,輸出邊資訊(Kruskal中邊頂點按陣列序號升序輸出)

樣例輸入

6 v1 v2 v3 v4 v5 v6 10 v1 v2 6 v1 v3 1 v1 v4 5 v2 v3 5 v2 v5 3
v3 v4 5 v3 v5 6 v3 v6 4 v4 v6 2 v5 v6 6 v1

樣例輸出

15 prim: v1 v3 1 v3 v6 4 v6 v4 2 v3 v2 5 v2 v5 3 kruskal: v1 v3 1 v4 v6 2 v2 v5 3 v3 v6 4 v2 v3 5    
#include<iostream>
using
namespace std; struct{ string adjvex; int lowcost; }closedge[100]; class MGraph { public: int graph[100][100],graph1[100][100]; int n,len; //n 是節點個數 len是邊的數 int visited[100],low[100]; string *q;//存節點 string start; int startpos; MGraph(){}; void SetMGraph() { int i,j; cin
>>n; for(i=0;i<100;i++) for(j=0;j<100;j++) { graph[i][j]=10000; //將每個權值置為最大 graph1[i][j]=10000; } q=new string[n]; for(i=0;i<n;i++) cin>>q[i]; cin>>len; for(i=1;i<=len;i++) { string ch1,ch2; int weight; cin>>ch1>>ch2>>weight; int loc1,loc2; for(j=0;j<n;j++) { if(q[j]==ch1) loc1=j; if(q[j]==ch2) loc2=j; } graph1[loc1][loc2]=graph[loc1][loc2]=weight; graph1[loc1][loc2]=graph[loc2][loc1]=weight;//無向圖 } cin>>start; for(i=0;i<n;i++) if(q[i]==start) startpos=i; } void prim() { int i,j; for(i=1;i<=n;i++) visited[i]=0; visited[startpos]=1; int min; for(i=0;i<n;i++) { min=99999; for(j=0;j<n;j++) { if(graph[i][j]<min) { min=graph[i][j]; closedge[i].adjvex=q[j]; closedge[i].lowcost=min; } } } string s3; string *e1,*e2; int *w3; e1=new string[100]; e2=new string[100]; w3=new int[100]; int index,k=0; for(i=0;i<n;i++) { min=99999; for(j=0;j<n;j++) { if(!visited[j]) continue; else { if(min>closedge[j].lowcost) { min=closedge[j].lowcost; s3=closedge[j].adjvex; index=j; } } } e1[k]=q[index];e2[k]=s3,w3[k++]=min; for(int g=0;g<n;g++) { if(q[g]==s3) { visited[g]=1; // graph[index][g]=99999; // graph[g][index]=99999; break; } } for(int g=0;g<n;g++) { min=99999; for(int m=0;m<n;m++) { if(min>graph[g][m] && visited[m]==0) { min=graph[g][m]; closedge[g].adjvex=q[m]; closedge[g].lowcost=min; } } } } int weight=0; for(i=0;i<k-1;i++) { weight+=w3[i]; } cout<<weight<<endl; cout<<"prim:"<<endl; for(i=0;i<k-1;i++) cout<<e1[i]<<" "<<e2[i]<<" "<<w3[i]<<endl; } void kruskal() { cout<<"kruskal:"<<endl; int *uni=new int[n]; for(int i=0;i<n;i++) { uni[i]=i; } for(int i=0;i<n-1;i++) { int min=99999;int x,y; for(int j=0;j<n;j++) { for(int l=0;l<n;l++) { if(j==l) continue; if(uni[j]==uni[l]) continue; else { if(min>graph1[j][l]) { min=graph1[j][l]; x=j;y=l; } } } } graph1[x][y]=10000;graph1[y][x]=10000; if(x>y) int k;k=x;x=y;y=k; for(int i=0;i<n;i++) { if(uni[i]==uni[y]&&i!=y) uni[i]=uni[x]; } uni[y]=uni[x]; cout<<q[x]<<" "<<q[y]<<" "<<min<<endl; } } void show() { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) cout<<graph[i][j]<<" "; cout<<endl; } } }; int main() { MGraph m,M; m.SetMGraph(); m.prim(); m.kruskal(); }