O(n)但是T了!
查看原帖
O(n)但是T了!
606710
dzy5551012楼主2022/8/17 21:03

一堆细节问题调了一个半小时就离谱(orz拜托了

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<map>
using namespace std;
const int Maxn = 2e5+50;
typedef long long ll;
int n,m;
vector<int>a[Maxn];
vector<int>cn0;
vector<int>cn1;
int vis[Maxn];
inline void init(){
	for(int i=1;i<=n;++i){
		a[i].clear();
	}
	cn1.clear();
	cn0.clear();
	memset(vis,-1,sizeof(vis));
}
inline void dfs(int u){
	//cout<<"U"<<u<<endl;
	//for(int i=0;i<a[u].size();++i)cout<<"son"<<a[u][i]<<endl;
	for(int i=0;i<a[u].size();++i){
		if(vis[a[u][i]]!=-1)continue;
		//还没走过
		int c=a[u][i];
		//cout<<"T"<<~c;
		//cout<<"C"<<c<<endl;
		vis[c]=!vis[u];
		if(vis[c])cn1.push_back(c);
		else cn0.push_back(c);
		dfs(c);
	}
}
inline void solve(){
	init();
	scanf("%d%d",&n,&m);
	//sort(choice.begin(),choice.end(),cmp);
	for(int i=1,u,v;i<=m;++i){
		scanf("%d%d",&u,&v);
		a[u].push_back(v);
		a[v].push_back(u);
	}
	vis[1]=1;
	cn1.push_back(1);
	dfs(1);
	if(cn1.size()>cn0.size()){
		int len=cn0.size();
		cout<<len<<endl;
		for(int i=0;i<len;++i){
			cout<<cn0[i]<<" ";
		}
	}
	else{
		int len=cn1.size();
		cout<<len<<endl;
		for(int i=0;i<len;++i){
			cout<<cn1[i]<<" ";
		}
	}
	cout<<endl;
}
int main(){
	int t;
	scanf("%d",&t);
	for(;t;--t){
		solve();//remember to init completely
	}
	
	return 0;
	
}
2022/8/17 21:03
加载中...