58pts,求助大佬
查看原帖
58pts,求助大佬
1068071
wangft楼主2024/5/25 20:37
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct node{
	int n;
	int l;
	int b;
	int o;
	bool operator<(const node&b) const
	{return l>b.l;}
};
priority_queue<node>q;
vector<node>a[100100];
int v[100100],an[100100][4];
int n,m,kk;
int main(){
	int i,j,k,p,h,gg=0,uu=0,t=0;
	cin>>n>>m>>kk;
	node x,y;
	h=0;
	for(i=1;i<=m;i++){
		cin>>x.n>>y.n>>x.l;
		y.l=x.l;
		x.o=0; y.o=1;
		a[x.n].push_back(y);
		a[y.n].push_back(x);
	}
	for(i=1;i<=n;i++)
	v[i]=-1;
	x.n=1; x.b=0; 
	q.push(x);
	while(!q.empty()){
		x=q.top();
		q.pop();
		if(v[x.n]==-1){
			v[x.n]=1;
			if(x.n!=1){
			h++;
			if(x.l==0) uu++;
			if(x.o==1){an[h][1]=x.b; an[h][2]=x.n;}
			else if(x.o==0){an[h][1]=x.n; an[h][2]=x.b;}
			an[h][3]=x.l;
		}
			for(i=0;i<a[x.n].size();i++){
				y.n=a[x.n][i].n;
				y.l=a[x.n][i].l;
				y.b=x.n;
				y.o=a[x.n][i].o;
				q.push(y);
			}
		}
	}
	if(h==n-1)
	while(uu>kk&&gg<=n-1){
		gg++;
		if(an[gg][3]==0)
		for(i=0;i<a[an[gg][1]].size();i++)
		if(a[an[gg][1]][i].l==1){
			uu--;
			an[gg][2]=a[an[gg][1]][i].n;
			if(a[an[gg][1]][i].o==0)
			swap(an[gg][1],an[gg][2]);
			an[gg][3]=1;
			break;
		} 
	}
	if(uu==kk&&h==n-1){
	for(i=1;i<=n-1;i++)
	cout<<an[i][1]<<" "<<an[i][2]<<" "<<an[i][3]<<endl;
}
	else cout<<"no solution"<<endl;
}

2024/5/25 20:37
加载中...