求助44pts
查看原帖
求助44pts
341764
Hazet楼主2022/3/14 13:24
#include<bits/stdc++.h>

#define int long long
#define mem(x,y) memset(x,y,sizeof(x))
#define frein freopen("in.in","r",stdin)
#define freout freopen("out.out","w",stdout)
#define debug(x) cout << (#x) << " = " << x << endl;

using namespace std;

int read(){
   int s = 0,w = 1;
   char ch = getchar();
   while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
   while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar();
   return s * w;
}

struct node{
	int x;
	int y;
	int w;
	bool flag;
}e[10000010];

int n,m,k;
int pre[10000010];
int cnt;
int tot;
int siz;

vector <pair<int,int>> q;
vector <int> ans;
vector <int> ans1;

void init(){for(int i = 1;i <= n;i ++)pre[i] = i;}

int find(int x){
	if(pre[x] == x)return x;
	return pre[x] = find(pre[x]);
}

bool cmp(node x,node y){return x.w < y.w;}

bool cmp1(node x,node y){return x.w > y.w;}

signed main(){
	cin>>n>>m>>k;
	for(int i = 1;i <= m;i ++)e[i].x = read(),e[i].y = read(),e[i].w = (read() ^ 1);
	init();
	for(int i = 1;i <= m;i ++)pre[find(e[i].x)] = find(e[i].y);
	int v = find(1);
	for(int i = 2;i <= n;i ++){
		if(find(i) != v){
			puts("no solution");
			return 0;
		}
	}
	init();
	sort(e + 1,e + m + 1,cmp);
	for(int i = 1;i <= m;i ++){
		int xx = find(e[i].x);
		int yy = find(e[i].y);
		if(xx != yy){
			if(e[i].w == 1){
				q.push_back({e[i].x,e[i].y});
				ans1.push_back(i);
				e[i].flag = true;
				tot ++;
			}
			pre[xx] = yy;
			cnt ++;
		}
	}
	v = find(1);
	for(int i = 2;i <= n;i ++){
		if(find(i) != v){
			puts("no solution");
			return 0;
		}
	}
	init();
	siz = q.size();
	if(siz > k){
		puts("no solution");
		return 0;
	}
	if(siz){
		for(int i = 0;i <= siz - 1;i ++){
			int x = q[i].first;
			int y = q[i].second;
			pre[find(x)] = find(y);
		}
	}
	sort(e + 1,e + m + 1,cmp1);
	cnt = tot;
	for(int i = 1;i <= m;i ++){
		if(e[i].flag)continue;
		if(e[i].w == 1 && tot >= k)continue;
		int xx = find(e[i].x);
		int yy = find(e[i].y);
		if(xx != yy){
			pre[xx] = yy;
			if(e[i].w == 1)tot ++;
			cnt ++;
			ans.push_back(i);
			if(cnt == n - 1)break;
		}
	}
	v = find(1);
	for(int i = 2;i <= n;i ++){
		if(find(i) != v){
			puts("no solution");
			return 0;
		}
	}
	if(cnt != n - 1)puts("no solution");
	else {
		siz = ans1.size();
		if(siz)for(int i = 0;i <= siz - 1;i ++)printf("%lld %lld %lld\n",e[ans1[i]].x,e[ans1[i]].y,e[ans1[i]].w ^ 1);
		siz = ans.size();
		if(siz)for(int i = 0;i <= siz - 1;i +  +)printf("%lld %lld %lld\n",e[ans[i]].x,e[ans[i]].y,e[ans[i]].w ^ 1);
	}
}

WA 1 2 4 5 不懂

2022/3/14 13:24
加载中...