这道题为什么我用贪心和并查集提交错了??

a330416020 2010-08-12 10:04:26
还是畅通工程
时间限制(普通/Java):3000MS/10000MS 运行内存限制:65536KByte
总提交:78 测试通过:43

描述

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

输入

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。


输出

对每个测试用例,在1行里输出最小的公路总长度。

样例输入


3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

样例输出


3
5


#include<iostream>
#include<algorithm>
using namespace std;
int set[105],num[105];
int flag;
struct S
{
int a,b,c;
}d[5000];
bool cmp(S i,S j)
{
return i.c<j.c;
}
int find(int a)
{
int r;
r=a;
while(set[r]!=r)
{
r=set[r];
}
return r;
}
void link(int a,int b)
{
if(a==b)
{
return ;
}
if(num[a]<=num[b])
{
set[a]=b;
num[b]=num[a]+num[b];
flag=num[b];
}
else
{
set[b]=a;
num[a]=num[a]+num[b];
flag=num[a];
}
}
int main()
{
int n,i;
while(cin>>n)
{
if(n==0) break;
memset(set,0,sizeof(set));
memset(num,0,sizeof(num));
int t;
t=n*(n-1)/2;
for(i=0;i<t;i++)
{
cin>>d[i].a>>d[i].b>>d[i].c;
}
for(i=1;i<=n;i++)
{
set[i]=i;
num[i]=1;
}
sort(d,d+t,cmp);
int sum=0,f=1;
for(i=0;i<t;i++)
{
link(find(d[i].a),find(d[i].b));
if(flag>=n){sum=d[i].c+sum; break;}
if(flag>f)
{
sum=d[i].c+sum;
f=flag;
}
}
cout<<sum<<endl;
}
return 0;
}
...全文
98 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Justmeh 2010-08-12
  • 打赏
  • 举报
回复
最小生成树问题,prime算法
施工中请绕行 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 berryluo 的回复:]
prim里也有贪心的思想吧
[/Quote]

是啊 就是每次都取最小权值的边
berryluo 2010-08-12
  • 打赏
  • 举报
回复
prim里也有贪心的思想吧
施工中请绕行 2010-08-12
  • 打赏
  • 举报
回复
这个怎么能用贪心和茶饼及呢 这不是最小生成树吗?。。。

刚写的 普里姆算法


#include<iostream>
using namespace std;
int main()
{
int n,i,j,distance[101][101],lock[101],point,a,b;
while(cin>>n&&n)
{
memset(lock,0,sizeof(lock));
int mintree=0,finded=1,min;
lock[1]=1;
for(i=1;i<=n*(n-1)/2;i++)
{
cin>>a>>b;cin>>distance[a][b];
distance[b][a]=distance[a][b];
}
while(finded!=n)
{
min=100000000;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(lock[i]==1&&lock[j]==0)
if(min>distance[i][j])
{
min=distance[i][j];
point=j;
}

mintree+=min; lock[point]=1;
finded++;
}
cout<<mintree<<endl;
}

return 0;
}
a330416020 2010-08-12
  • 打赏
  • 举报
回复
嗯嗯1知道了!!
luozhongzhu 2010-08-12
  • 打赏
  • 举报
回复
赤裸裸的prim~~~
a330416020 2010-08-12
  • 打赏
  • 举报
回复
哦哦,我觉得我的那个好像有道理啊!!

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧