题目大意:裸的最大生成树
思路:就是和最小生成树相似,Map数组初始化为0,并且在建立生成树的时候要选去最大的边进入集合。
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
int n;
int Map[1010][1010],dis[1010];
bool vis[1010];
int prim()
{
int i,j;
memset(vis,false,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=Map[1][i];
vis[1]=true;
dis[1]=0;
int ma,po,s=0;
for(i=1;i<n;i++)
{
ma=0;
po=-1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>ma)
{
ma=dis[j];
po=j;
}
}
if(po==-1)
return -1;
s+=ma;
vis[po]=true;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<Map[po][j])
dis[j]=Map[po][j];
}
}
return s;
}
int main()
{
int m,i,j,k;
int a,b,c;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
Map[i][j]=0;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(Map[a][b]<c)
Map[a][b]=Map[b][a]=c;
}
cout<<prim()<<endl;
}
return 0;
}