/*Prim*/
#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 1000000
fstream fin;
//function
void prim(int **a,int n);
int main()
{
fin.open("1009.txt",ios::in);
int n,m;
fin>>n>>m;
int **a=new int*[n];
for(int i=0;i<n;i++)
a[i]=new int[n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=0;
for(int i=0;i<m;i++)
{
int x,y,weight;
fin>>x>>y>>weight;
a[x-1][y-1]=weight;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
prim(a,n);
system("pause");
return 0;
}
void prim(int **a,int n)
{
bool *f=new bool[n];
int *lowest=new int[n];
memset(lowest,0,sizeof(lowest));
int *closet=new int[n];
for(int i=0;i<n;i++)
{
f[i]=false;//false
lowest[i]=a[0][i];
closet[i]=0;
}
f[0]=true;
for(int i=0;i<n-1;i++)
{
int min=MAXN;
int u=0;
for(int j=0;j<n;j++)
{
if(!f[j]&&lowest[j]!=0&&min>lowest[j])
{
min=lowest[j];
u=j;
}
}
f[u]=true;
cout<<closet[u]<<" "<<u<<" "<<lowest[u]<<endl;
for(int j=0;j<n;j++)
{
if(!f[j]&&a[u][j]<lowest[j]&&a[u][j])
{
lowest[j]=a[u][j];
closet[j]=u;
}
else if(!f[j]&&lowest[j]==0&&a[u][j])
{
lowest[j]=a[u][j];
closet[j]=u;
}
}
}
}
prim算法求最小生成树
最新推荐文章于 2022-11-18 18:31:49 发布