40pts 求调 玄关
查看原帖
40pts 求调 玄关
1008153
quanyidong楼主2024/11/27 19:13

思路先把其分成两个块使得两个块没有边相连 再在其中选两个点使这两个点相连 然后将一个点与和它不在同一个连通块的点相连

#include<bits/stdc++.h>
using namespace std;
int t,n,m,vis[300010],l,cnt;
vector<int> v[300010];
struct node
{
	int u,v;
};
node g[300010];
void dfs(int x)
{
	if(vis[x]) return;
	vis[x]=1;
	for(int i:v[x]) dfs(i);
}
signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		if(m==0)
		{
			cout<<"Yes\n";
			continue;
		}
		cnt=0;l=0;
		memset(vis,0,sizeof vis);
		memset(g,0,sizeof g);
		for(int i=1;i<=m;i++)
		{
			int x,y;
			cin>>x>>y;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		dfs(1);
		for(int i=1;i<=n;i++)
		{
			if(vis[i]==0)
			{
				l=i;
				break;
			}
		}
		if(l==0){
			cout<<"No\n";
			continue;
		}
		cout<<"Yes\n";
		for(int i=1;i<=n;i++)
		{
			if(vis[i]==1&&i!=1)
			{
				g[++cnt]={l,i};
			}
			if(vis[i]==0&&i!=l)
			{
				g[++cnt]={1,i};
			}
		}
		g[++cnt]={1,l};
		for(int i=1;i<=cnt;i++)
		{
			cout<<g[i].u<<' '<<g[i].v<<endl;
		}
	}
	return 0;
}

WA on Subtask #1 #2 #3 #7

2024/11/27 19:13
加载中...