BZOJ 3264 [Apio2008]免费道路

3624: [Apio2008]免费道路

Time Limit: 2 Sec   Memory Limit: 128 MBSec   Special Judge
Submit: 1214   Solved: 477
[ Submit][ Status][ Discuss]

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

/*大体思路:先用为0的边 判断一下是否够K条
然后在往上加 为1的边 一定能构成 最小生成树 
*/ 
#include
#include
#include
using namespace std;
#define maxn 20010
#define maxm 100010
struct Edge{int u,v,w;}a[maxm],b[maxm],ans[maxm];
//a用来存边为1的道路 b用来存边为0的道路 
int fa[maxn],n,m,k,m0,m1,p;
int find(int x){
	if(fa[x]==x)return x;
	else return fa[x]=find(fa[x]);
}
int flag[maxm];
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1,u,v,w;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		if(w==1) a[++m1]=(Edge){u,v,w};
		else b[++m0]=(Edge){u,v,w};
	}
	int cnt=0;
	for(int i=1;i<=n;i++) fa[i]=i;
	
	for(int i=1;i<=m1;i++){
		int u=a[i].u,v=a[i].v;
		int rx=find(u),ry=find(v);
		if(rx==ry) continue;
		fa[rx]=ry;
		if(++cnt == n-1)break;
	}
	
	for(int i=1;i<=m0;i++){
		int u=b[i].u,v=b[i].v;
		int rx=find(u),ry=find(v);
		if(rx == ry) continue;
		fa[rx]=ry; ans[++p]=b[i]; flag[i]=1;
		if(++cnt == n-1 ) break;
	}
	if(p>k || cnt

你可能感兴趣的:(BZOJ,图论)