您的位置:首页 > 其它

VIJOS-P1045 有些糊涂。 原来这才是真懂

2013-03-09 10:42 351 查看
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 100010
int u[maxn],v[maxn],r[maxn],p[maxn];
double w[maxn];
using namespace std;
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
int cmp(const int i,const int j){return w[i]<w[j];}
double kruskal(int n,int count)
{
int k=n-1;
for(int i=0;i<n;i++) p[i]=i;//这地方换成p[i]=i结果就不一样了 我去去!!!
for(int i=0;i<count;i++) r[i]=i;//这地方换成r[i]为嘛结果就不一样了 我去
sort(r,r+count,cmp);
//for(int i=0;i<count;i++) printf("%d  ",r[i]);
double ans=0;
for(int i=0;i<count;i++)
{
int x,y;
int e=r[i];x=find(u[e]);y=find(v[e]);
if(x!=y)
{
ans+=w[e];
p[x]=y;
k--;
}
}
if(k!=0)  ans=100000000;//这地方应该是特别大的数
return ans;
}
int main()
{
double s;int n,count=0;
//freopen("input.txt","r",stdin);
scanf("%lf%d",&s,&n);
int a,b;double c;
while(scanf("%d%d%lf",&a,&b,&c)!=EOF)
{
u[count]=a-1;v[count]=b-1;w[count]=c;
count++;
}
/*for(int i=0;i<count;i++)
printf("%f  ",w[i]);*/

double ans=kruskal(n,count);
if(count<n-1) { printf("Impossible\n"); return 0;}
if(ans<=s)
printf("Need %.2lf miles of cable\n",ans);
else printf("Impossible\n");
return 0;
}


来总结一下问题:

1.标号为1-N,这个算法是针对0-N-1的,上一个题对了,所以没发现这个问题

2.得结合题目要求去做。 k一开始=n-1,是使所有的点之间都能连接。 //这往下可以不用,自己前面一开始写错了,if(k!=0) ans=100000000;//这地方应该是特别大的数,而count<n-1则直接无法连通(是小于n-1,不是小于n)

3.另外OJ上虽然自己是照一组数据写的,但也可能是多组测试数据。望都全面应对!

4.相信OJ,否定自己@@
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: