BZOJ3624【生成树】

来源:互联网 发布:c语言学生综合测评系统 编辑:程序博客网 时间:2024/06/16 20:15
/* I will wait for you */ #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iostream>#include<fstream>#include<vector>#include<queue>#include<deque>#include<set>#include<map>#include<string>#define make(a,b) make_pair(a,b)#define fi first#define se second using namespace std; typedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> PII; const int maxn=1000010;const int maxm=1010;const int maxs=26;const int INF=1<<29;const int P=1000000000;const double error=1e-9;struct edge{ int u,v,t,in; }e[maxn];int n,m,k,fa[maxn];inline int read(){int x=0;char ch=getchar();while(ch>'9'||ch<'0') ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x;}int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}int main(){n=read(),m=read(),k=read();for(int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].t=read();for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++) if(e[i].t){int fu=find(e[i].u),fv=find(e[i].v);if(fu!=fv) fa[fu]=fv;}for(int i=1;i<=m;i++) if(!e[i].t){int fu=find(e[i].u),fv=find(e[i].v);if(fu!=fv) e[i].in=1,fa[fu]=fv;}int tmp=0;for(int i=1;i<=m;i++) if(!e[i].t&&e[i].in) tmp++;if (tmp>k) { printf("no solution\n");return 0; }for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++) if(!e[i].t&&e[i].in){int fu=find(e[i].u),fv=find(e[i].v);if(fu!=fv) fa[fu]=fv;}for(int i=1;tmp<k&&i<=m;i++) if(!e[i].t&&!e[i].in){int fu=find(e[i].u),fv=find(e[i].v);if(fu!=fv) tmp++,e[i].in=1,fa[fu]=fv;}for(int i=1;i<=m;i++) if(e[i].t){int fu=find(e[i].u),fv=find(e[i].v);if(fu!=fv) e[i].in=1,fa[fu]=fv;}int sum=0;for(int i=1;i<=m;i++) if(e[i].in) sum++;if(sum!=n-1||tmp!=k) { printf("no solution\n");return 0; }for(int i=1;i<=m;i++) if(e[i].in) printf("%d %d %d\n",e[i].u,e[i].v,e[i].t);return 0;}

0 0
原创粉丝点击