标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1254 Accepted Submission(s): 414
2 1 0 1 10 4 0
10 impossible
代码:
Kruskal算法:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct record
{
int s,e,w;
}num[10010];
bool cmp(record a,record b)
{
return a.w<b.w;
}
int per[1010];
int m,n;
int init()
{
for(int i=0;i<n;i++)
{
per[i]=i;
}
}
int find(int x)
{
int r;
r=x;
while(r!=per[r])
{
r=per[r];
}
per[x]=r;
return r;
}
int join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
per[fx]=fy;
return true;
}
return false;
}
int main()
{
int i,f,sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
f=1;
sum=0;
init();
for(i=0;i<m;i++)
{
scanf("%d%d%d",&num[i].s,&num[i].e,&num[i].w);
}
sort(num,num+m,cmp);
for(i=0;i<m;i++)
{
if(join(num[i].s,num[i].e))
{
sum+=num[i].w;
f++;
}
}
if(f!=n)
printf("impossible\n\n");
else
printf("%d\n\n",sum);
}
return 0;
}
Prim算法:
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f
int map[1010][1010],low[1010],vis[1010];
int n,m;
int init()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
map[i][j]=map[j][i]=0;
else
map[i][j]=map[j][i]=INF;
}
}
}
void prim()
{
int i,j,min,next,sum=0;
for(i=0;i<n;i++)
{
vis[i]=0;
low[i]=map[0][i];
}
vis[0]=1;
for(i=1;i<n;i++)
{
min=INF;
for(j=0;j<n;j++)
{
if(!vis[j]&&min>low[j])
{
min=low[j];
next=j;
}
}
if(min==INF)
{
printf("impossible\n\n");
return ;
}
vis[next]=1;
sum+=min;
for(j=0;j<n;j++)
{
if(!vis[j]&&low[j]>map[next][j])
{
low[j]=map[next][j];
}
}
}
printf("%d\n\n",sum);
}
int main()
{
int i,j,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
prim();
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 2122 Ice_cream’s world III 【最小生成树】
标签:
原文地址:http://blog.csdn.net/longge33445/article/details/47617977