2011-11-02 45 views
0

我有以下從圖論的話題,克魯斯卡算法最小生成樹克魯斯卡爾算法實現

#include<iostream> 
#include<stdlib.h> 
using namespace std; 
int cost[10][10],i,j,k,n,m,c,visit,visited[10],l,v,count,count1,vst,p; 
int main(){ 
    int dup1,dup2; 
    cout<<" enter number of vertices "<<endl; 
    cin>>n; 
    cout<<"enter number of edges "<<endl; 
    cin>>m; 
    cout<<" EDGES Cost "<<endl; 
    for(k=1;k<=m;k++){ 
     cin>>i>>j>>c; 
     cost[i][j]=c; 
     cost[j][i]=c; 

    } 
    for(i=1;i<=n;i++) 

     for(j=1;j<=m;j++) 

      if(cost[i][j]==0) 
       cost[i][j]=31999; 
      visit=1; 
      while(visit<n){ 
       v=31999; 
       for(i=1;i<=n;i++) 
        for(j=1;j<=n;j++) 
    if(cost[i][j]!=31999 && cost[i][j]<v && cost[i][j]!=-1) 
    { 
     int count=0; 
     for(p=1;p<=n;p++){ 


      if(visited[p]==i || visited[p]==j) 
       count++; 
     } 
     if(count>=2){ 

      for(p=1;p<=n;p++) 
       if(cost[i][p]!=31999 && p!=j) 
        dup1=p; 
      for(p=1;p<=n;p++) 
       if(cost[j][p]!=31999 && p!=i) 
        dup2=p; 
      if(cost[dup1][dup2]==-1) 
       continue; 
     } 
     l=i; 
     k=j; 
     v=cost[i][j]; 

     } 

     cout<<" edgde from "<<l<<" --> "<<k; 
     cost[l][k]=-1; 
     cost[k][l]=-1; 
     visit++; 
     int count=0; 
     count1=0; 
     for(i=1;i<=n;i++) 
     { 

      if(visited[i]==1) 
       count++; 
      if(visited[i]==k) 
       count1++; 

     } 
     if(count==0) 
      visited[++vst]=1; 
     if(count1==0) 
      visited[++vst]=k; 

     } 


return 0; 
} 

其工作代碼和下面的輸入

1 2 1 
2 3 2 
3 4 3 
1 3 3 

這裏邊的頂點的數量和數量是4,給我這樣的輸出

edge from 1–>2edge from 2–>3edge from 1–>3 

我的問題是有沒有語義的e我的(編程)語言是C++

回答

2

用戶輸入可以很容易地打破這個代碼:如果用戶給n等於或大於10的n值或者m,你可以運行數組的末尾。

+0

它是肯定的,我可以輸入更多然後10,只是我很有趣的算法實現 –