poj 2377 Bad Cowtractors

来源:互联网 发布:杭州酱鸭哪家最好 知乎 编辑:程序博客网 时间:2024/04/29 09:40

Memory: 4104KTime: 63MSLanguage: C++Result: Accepted

求最大生成树,直接prim.

#include<stdio.h>

#define INT_MAX -10000000
const int MAXN=1001;
int  arr[MAXN][MAXN],total; 
int  used[MAXN],dis[MAXN];
int flag;
 //最大生成树
void prim(int n) 
{
int v,max,k;
int i,j;
for(i=1;i<=n;i++) //先默认第一个为待选节点
{
used[i]=0; 
dis[i]=arr[1][i];

used[1]=1; 
for(k=1;k<=n;k++)
{
max=INT_MAX;
v=0; 
for(i=1;i<=n;i++) 
if(!used[i] && dis[i]>max) //在待选节点中选出最大
{
max=dis[i]; 
v=i; 

if(v==0)
break;
total=total+max;
used[v]=1; 
for(j =1;j<=n;j++) 
if(!used[j] && dis[j]<arr[v][j])//新引入的顶点到其他顶点的边值是否大于原来的边值   
dis[j]=arr[v][j];
}
if(k<n)//不连通
printf("-1\n");
else
   printf("%d\n",total); 
}                   

int main() 
{
int n,q,i,j,a,b,c;
while(scanf("%d",&n)==1)
{
flag=0;
for(i=1;i<=n;i++) 
for(j=1;j<=n;j++) 
arr[i][j]=INT_MAX;
total=0;
scanf("%d",&q);
for( i=1;i<=q;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c>arr[a][b])
   arr[a][b]=arr[b][a]=c;
}
prim(n); 
}   
return 0; 
}      

原创粉丝点击