2011-11-02 71 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,只是我很有趣的算法实现 –