题解思路求调!
查看原帖
题解思路求调!
1332453
__Florie_楼主2024/9/13 22:07

学习了 此题解 的做法,有同样想法的大佬帮忙看一看。

评测记录:here

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ldb long double

/*
无论你上岸与否, 
请在最后一定要记住 
		——一路陪你走来的人是她。 
*/

template<typename T>
inline void read(T &x){
    bool f=1;x=0;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=!f;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch-48);ch=getchar();}
    x=(f?x:-x);return ;
}
template<typename T>
inline void print(T n){
	if(n<0) {putchar('-');n*=-1;}
	if(n>9) print(n/10);
	putchar(n%10+'0'); return ;
}

int t,n,m,l,r,rev[200010],op,opp;
bool flo[200010],co[200010],in[200010];
vector<int>ve[200010];
void pre(){
	for(int i=1;i<n;i++) ve[i].clear();
	for(int i=1;i<=n;i++) co[i]=flo[i]=in[i]=0;
	op=opp=0; return ;
}
void add(int u,int v) {ve[u].push_back(v); return ;}
queue<int>qu;
bool huan(int noww,int las){
	bool f=0;
	for(int i=0;i<ve[noww].size();i++){
		if(f||ve[noww][i]==las) continue;
		if(flo[ve[noww][i]]) {op++; rev[op]=ve[noww][i]; return 1;}
		flo[ve[noww][i]]=1; op++; rev[op]=ve[noww][i];
		f=max(f,huan(ve[noww][i],noww));
		if(f) continue; op--;
	}
	return f;
}
bool nect(){
	int cnt=1;
	bool fl[200010]={0}; qu.push(1); fl[1]=1;
	while(!qu.empty()){
		int id=qu.front(); qu.pop();
		for(int i=0;i<ve[id].size();i++){
			if(fl[ve[id][i]]) continue;
			fl[ve[id][i]]=1; cnt++; qu.push(ve[id][i]);
		}
	}
	if(cnt<n) return 0;
	else return 1;
}
void paint(int id){
	co[id]=1;// cout<<id<<" qwq ";
	for(int i=0;i<ve[id].size();i++){
		if(co[ve[id][i]]||in[ve[id][i]]) continue;
		paint(ve[id][i]);
	}
	return ;
}

signed main(){
	read(t);
	for(int tt=1;tt<=t;tt++){
		read(n); read(m); if(m==0) {print(-1); cout<<'\n'; continue;}
		pre();
		for(int i=1;i<=m;i++) {read(l); read(r); add(l,r); add(r,l); }
		if(!huan(1,0)) {print(-1); cout<<'\n'; continue;}
		if(!nect()) {print(-1); cout<<'\n'; continue;}
		opp=op;
		for(int i=1;i<=op;i++) if(rev[i]==rev[opp]) {op=i; break;}
		for(int i=op;i<=opp;i++) in[rev[i]]=1;
		//for(int i=op;i<=opp;i++) cout<<rev[i]<<" ";cout<<"??????";
		paint(rev[op]);
		for(int i=1;i<=n;i++)
		if(co[i]) cout<<'B'; else cout<<'W';
		cout<<'\n';
	}
	return 0;
}
2024/9/13 22:07
加载中...