3624: [Apio2008]免费道路

Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 111  Solved: 49
[Submit][Status]

Description

Input

Output

Sample Input

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

Sample Output

3 2 0
4 3 0
5 3 1
1 2 1
 
  还是看的网上的标程。。。。。
  这道题的做法是先1边优先,做生成树,如果0边个数大于k无解,否则随便假如能加的0边补足k条,剩下由1边补足。
  这个怎么证明呢?我们考虑第一遍找出的0边最少的生成树,当我们随机加入一条0边,保证不存在0边环,那么我们都能删去一个1边,这个由第一颗生成树尽量加入1边的性质可得,那么以上的做法就可以理解了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 1000010
struct edge
{
int x,y;
};
vector<edge> v0,v1;
bool vis0[MAXN],vis1[MAXN];
int uf[MAXN];
int get_fa(int now)
{
return (uf[now]==now)?now:uf[now]=get_fa(uf[now]);
}
bool comb(int x,int y)
{
x=get_fa(x);
y=get_fa(y);
if (x==y)return ;
uf[x]=y;
return ;
}
int main()
{
freopen("input.txt","r",stdin);
int n,m,i,j,k,x,y,z;
int cnt=;;
int tot=;
scanf("%d%d%d",&n,&m,&k);
edge et;
for (i=;i<=n;i++)
uf[i]=i;
for (i=;i<m;i++)
{
scanf("%d%d%d",&et.x,&et.y,&z);
if (z)
v1.push_back(et);
else
v0.push_back(et);
}
for (i=;i<v1.size();i++)
{
comb(v1[i].x,v1[i].y);
}
for (i=;i<v0.size();i++)
{
vis0[i]=comb(v0[i].x,v0[i].y);
cnt+=vis0[i];
}
if (cnt>k)
{
printf("no sulotion\n");
return ;
}
for (i=;i<=n;i++)
uf[i]=i;
for (i=;i<v0.size();i++)
{
if (vis0[i])
comb(v0[i].x,v0[i].y);
}
for (i=;i<v0.size();i++)
{
if (cnt==k)break;
if (vis0[i])continue;
vis0[i]=comb(v0[i].x,v0[i].y);
cnt+=vis0[i];
}
for (i=;i<v1.size();i++)
{
vis1[i]=comb(v1[i].x,v1[i].y);
}
for (i=;i<v0.size();i++)
if (vis0[i])
tot++;
for (i=;i<v1.size();i++)
if (vis1[i])
tot++;
if (cnt!=k || tot!=n-)
{
printf("no solution\n");
return ;
}
for (i=;i<v0.size();i++)
if (vis0[i])
printf("%d %d %d\n",v0[i].x,v0[i].y,);
for (i=;i<v1.size();i++)
if (vis1[i])
printf("%d %d %d\n",v1[i].x,v1[i].y,);
}
 

bzoj 3624: [Apio2008]免费道路 生成树的构造的更多相关文章

  1. BZOJ 3624: [Apio2008]免费道路 [生成树 并查集]

    题意: 一张图0,1两种边,构造一个恰有k条0边的生成树 优先选择1边构造生成树,看看0边是否小于k 然后保留这些0边,补齐k条,再加1边一定能构成生成树 类似kruskal的证明 #include ...

  2. BZOJ 3624: [Apio2008]免费道路

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1201  Solved:  ...

  3. BZOJ 3624 [Apio2008]免费道路:并查集 + 生成树 + 贪心【恰有k条特殊路径】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3624 题意: 给你一个无向图,n个点,m条边. 有两种边,种类分别用0和1表示. 让你求一 ...

  4. bzoj 3624: [Apio2008]免费道路【生成树+贪心】

    先把水泥路建生成树,然后加鹅卵石路,这里加的鹅卵石路是一定要用的(连接各个联通块),然后初始化并查集,先把必需的鹅卵石路加进去,然后随便加鹅卵石路直到k条,然后加水泥路即可. 注意判断无解 #incl ...

  5. Bzoj 3624: [Apio2008]免费道路 (贪心+生成树)

    Sample Input 5 7 2 1 3 0 4 5 1 3 2 0 5 3 1 4 3 0 1 2 1 4 2 1 Sample Output 3 2 0 4 3 0 5 3 1 1 2 1 这 ...

  6. BZOJ.3624.[APIO2008]免费道路(Kruskal)

    题目链接 我们发现有些白边是必须加的,有些是多余的. 那么我们先把所有黑边加进去,然后把必须要加的白边找出来. 然后Kruskal,把必须要加的白边先加进去,小于K的话再加能加的白边.然后加黑边. 要 ...

  7. [APIO2008]免费道路(生成树)

    新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可能保持所有道路免费.为此亟待制定一个新的 ...

  8. 3624: [Apio2008]免费道路

    Description Input Output Sample Input 5 7 2 1 3 0 4 5 1 3 2 0 5 3 1 4 3 0 1 2 1 4 2 1 Sample Output ...

  9. [Apio2008]免费道路[Kruscal]

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1292  Solved:  ...

随机推荐

  1. Mysql 进阶操作

    将已经存在表设置自动增长属性alter table student change id id int not null auto_increment primary key;(注:这个地方一定是原来就 ...

  2. windows修改mysql默认字符集不成功

    今天下午弄了半天,终于把mysql的默认字符集弄成了, 按照网上的说法,什么修改mysql下面的my.ini文件,把参数设置成utf-8,我反复操作,结果都是不成功,后来我把mysql5.0卸载了,网 ...

  3. GitHub与Versions

    [第一步]建立先仓库 第一步的话看一般的提示就知道了,在github新建一个repository(谷歌可以解决),都是可视化的界面操作,所以难度不大.或者看这里:https://help.github ...

  4. Regular Expressions in Grep Command with 10 Examples --reference

    Regular expressions are used to search and manipulate the text, based on the patterns. Most of the L ...

  5. C#随机函数random()典型用法集锦

    C#随机函数random()典型用法集锦 Random.Next() 返回非负随机数: Random.Next(Int) 返回一个小于所指定最大值的非负随机数 Random.Next(Int,Int) ...

  6. JavaScript的DOM操作(二)

    一:window.history对象 历史记录,通过历史记录可以操作页面前进或者后退 window.history.back();后退 window.history.forward();前进 wind ...

  7. Crawler & Ajax:WebBrowser C#

    Crawler 與 Ajax http://net.zdnet.com.cn/network_security_zone/2007/1005/536329.shtml WebBrowser: 利用We ...

  8. PhotoShop常用快捷键(1)

    一.工具栏工具 移动工具 [V] 矩形.椭圆选框工具 [M] 套索.多边形套索.磁性套索 [L] 快速选择.魔棒工具[W] 裁剪工具 [C] 吸管.颜色取样器 [I] 修补.污点修复[J] 画笔工具 ...

  9. C# 分页

    #region 分页 /// <summary> /// 分页 /// </summary> /// <param name="page">当前 ...

  10. php字符串函数(1)

    下面去学习一下php的字符串函数,那么怎么去看手册呢,举个例子 int strcasecmp ( string $str1 , string $str2 ) 第一个int,表示此函数返回的类型是int ...