题目名称 29. 公路建设
输入输出 road.in/out
难度等级 ★★
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 5
题目来源 Gravatarcqw 于2008-04-23加入
开放分组 全部用户
提交状态
分类标签
图论 最小生成树 动态树 平衡树
分享题解
通过:130, 提交:279, 通过率:46.59%
GravatarAntiLeaf 100 0.010 s 0.31 MiB C++
GravatarFoolMike 100 0.011 s 3.63 MiB C++
Gravatarblacko 100 0.013 s 0.33 MiB C++
GravatarKulliu 100 0.014 s 1.65 MiB C++
Gravatar@@@@ 100 0.021 s 0.52 MiB Pascal
Gravatar@@@@ 100 0.021 s 0.77 MiB Pascal
Gravatarhebomou 100 0.022 s 0.39 MiB C++
Gravatar@@@@ 100 0.022 s 0.77 MiB Pascal
Gravatar@@@@ 100 0.023 s 0.13 MiB Pascal
Gravatar@@@@ 100 0.026 s 0.26 MiB Pascal
本题关联比赛
2008haoi模拟训练2
图论练习和一些常规题
图论练习和一些常规题
关于 公路建设 的近10条评论(全部评论)
暴力跑过了?
GravatarFisher.
2017-07-28 00:06 12楼
两千分斩。
Gravatar槿柒
2016-08-28 21:43 11楼
两千分纪念
Gravatar521
2016-08-12 16:15 10楼
回复 @liu_runda :
说的对......
Gravatar洛克索耶夫
2016-02-20 07:07 9楼
这是稀疏图。。。prim暴力60分,kruskal暴力100分。
Gravatarliu_runda
2016-02-19 20:45 8楼

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
int totnum,tot,fa[502];
int n,m,x,y,q[502],kl;
bool b[502];
struct dd
{
int kaishi,zhong,juli;
int id;
}jie[5000];
int comp1(const dd &a,const dd &b)
{ if(a.juli==b.juli) return a.kaishi<b.kaishi;
return a.juli<b.juli;
}
int find(int x)
{
if(fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
inline int in()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return x;
}
bool KUR(int t){
sort(jie+1,jie+t+1,comp1);
int num=0;
totnum=0;
kl=0;
memset(b,0,sizeof(b));
for(int j=1;j<=n;++j) fa[j]=j;
for(int j=1;j<=t;++j)
{ int hi=jie[j].kaishi;
int hj=jie[j].zhong;
int yu=find(hj);
int lin=find(hi);
if(yu!=lin)
{
fa[yu]=lin;
totnum+=jie[j].juli;
num++;
q[++kl]=jie[j].id;
}
if(num==n-1)
return true;
}
return false;
}
int main()
{ /*freopen("road.in","r",stdin);
freopen("road.out","w",stdout);*/
n=in();
m=in();
for(int i=1;i<=m;++i)
{
jie[i].kaishi=in();
jie[i].zhong=in();
jie[i].juli=in();
jie[i].id=i;
if(i<n-1)
{
printf("0\n");
continue;
}
else
{
if(!KUR(i)){
printf("0\n");
continue;
}
else{
double fg=(double)totnum/2;
printf("%.1lf ",fg);
sort(q+1,q+kl+1);
for(int h=1;h<=kl;++h)
printf("%d ",q[h]);
printf("\n");
}
}
}
}

附上输出编号的代码
Gravatarforever
2015-08-23 17:19 7楼
这道题相比原题弱爆了。
Gravatar神利·代目
2015-08-06 15:30 6楼
花样作死冠军。。
Gravatarztx
2014-12-21 13:25 5楼
在自己电脑上没问题 交上去说运行时错误 求大神解答
Gravatar笑一炮
2014-10-27 16:50 4楼
TREAP套kruscal的飘过…………
GravatarOI永别
2014-04-15 20:59 3楼

29. 公路建设

★★   输入文件:road.in   输出文件:road.out   简单对比
时间限制:1 s   内存限制:128 MiB

【题目描述】


$A$ 国是一个新兴的国家,有 $N$ 个城市,分别编号为 $1$,$2$.$3$…$N$ 。政府想大搞公路建设,提供了优惠政策:对于每一个投资方案的预计总费用,政府负担 $50$% ,并且允许投资的公司对过往的汽车收取连续 $5$ 年的养路费。世界各地的大公司纷纷投资,并提出了自己的建设方案,他们的投资方案包括这些内容:公路连接的两座城市的编号,预计的总费用(假设他们的预计总是准确的)。


   你作为 $A$ 国公路规划局的总工程师,有权利决定每一个方案是否接受。但是政府给你的要求是:


    ( 1 )要保证各个城市之间都有公路直接或间接相连。


    ( 2 )因为是新兴国家,政府的经济实力还不强。政府希望负担最少的费用。


   因为大公司并不是同时提出方案,政府希望每接到一个方案,就可以知道当前需要负担的最小费用和接受的投资方案,以便随时开工。关于你给投资公司的回复可以等到开工以后再给。 注意: $A$ 国一开始是没有公路的。我们设定 $A$ 国的城市数目 $N<=500$ ,投资的方案总数 $M<=2000$ 。


【输入格式】


第 1 行有两个数字: $N$ 、 $M$;

第 2 行到第 $M+1$ 行给出了各个投资方案,第 $i$ 行的方案编号为 $i-1$;

编号小的方案先接到,一个方案占一行,每行有 3 个数字,分别是连接的两个城市编号 $a$ 、 $b$ ,和投资的预计总费用 $cost$ 。


【输出格式】


输出文件共有 $M$ 行。

每一行的第一个数字是当前政府需要负担的最少费用(保留 $1$ 位小数),后面是 $X$ 个数字,表示当前政府接受的方案的编号, 不要求从小到大排列。但如果此时接受的所有投资方案不能保证政府的第一条要求,那么这一行只有一个数字 $0$.


【样例输入】

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

【样例输出】

0
4.0 1 2
4.0 1 2
3.0 1 4
2.0 4 5

注意:由于没有评测插件,不要求输出方案。

故,样例只输出:
0
4.0
4.0
3.0
2.0

【提示】

在此键入。

【来源】

在此键入。