当前位置: 代码迷 >> 综合 >> 贪心算法之最短路径(KRUSKAL)
  详细解决方案

贪心算法之最短路径(KRUSKAL)

热度:36   发布时间:2023-11-26 07:53:57.0
#include <iostream>
#include <stdio.h>
using namespace std;
int ic,jc,coun=0,edge=0;
int T[100],A[100][100];
/*int judice(int x,int t[])
{for(int i=0;i<=coun-1;coun++){if(t[i]==x)return 1;elsereturn 0;}
}*/
void  Min(int n)//找最小值
{int MIN=99;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(A[i][j]<MIN){MIN=A[i][j];ic=i;jc=j;}}}
}
int main()
{int n,r;cout<<"cout n"<<endl;cin>>n;int b[n];//区分不同集合for(int i=1;i<=n;i++){A[i][i]=0;b[i]=i;}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){cin>>A[i][j];A[j][i]=A[i][j];}}//            按照二维数组的格式输入数据Min(n);//找到最小值T[coun++]=ic;//记录边T[coun++]=jc;//记录边if(b[jc]<b[ic])//如果两点连线,就将他们放入同一个集合,统一放入集合序号小的b[ic]=b[jc];elseb[jc]=b[ic];A[ic][jc]=99;//再将这个数置为最大数,以便下次找最小值edge+=1;//每找到两个顶点,边数加一while(edge<=n-1)//如果边数不到顶点数减一,就一直循环{Min(n);if(b[ic]!=b[jc])//不在一个集合{T[coun++]=ic;//记录边T[coun++]=jc;//记录边edge++;//边数加加if(b[jc]<b[ic])//如果两点连线,就将他们放入同一个集合,统一放入集合序号小的b[ic]=b[jc];elseb[jc]=b[ic];A[ic][jc]=99;}else{A[ic][jc]=99;}/* if(judice(jc,T)==1){A[ic][jc]=99;}else{if(judice(ic,T)==1){T[coun++]=ic;T[coun++]=jc;b[ic]=0;b[jc]=0;edge++;A[ic][jc]=99;}else{T[coun++]=ic;T[coun++]=jc;b[ic]=1;b[jc]=1;edge++;A[ic][jc]=99;}}}*/}for(int i=0;i<=(edge-1)*2-1;i++)cout << T[i] << endl;return 0;
}