Date:2022.01.21
题意:
n个点m条边的图,无自环和重边。找到一个生成树,使得度数最大的点的度数不变。
思路:这可能是最简单的3F,找到一个度数最大的点,与它的直接邻点相连的边一定选,选完将这些点标记为true,挨个搜这些邻点的邻点,dfs暴力搜莽过。
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 4e5+10;
typedef long long LL;
bool st[N];
LL n,m;
LL idx,e[N],ne[N],h[N],d[N];
void add(LL a,LL b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(LL x)
{
st[x]=true;
for(int i=h[x];i!=-1;i=ne[i])
{
if(st[e[i]]) continue;
cout<<x<<' '<<e[i]<<endl;
dfs(e[i]);
}
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
memset(h,-1,sizeof h);
while(m--)
{
LL x,y;cin>>x>>y;
add(x,y);add(y,x);d[x]++;d[y]++;
}
LL maxd=0,x=0;
for(int i=1;i<=n;i++) {maxd=max(maxd,d[i]);}
for(int i=1;i<=n;i++)
if(d[i]==maxd) {x=i;break;}
st[x]=true;
for(int j=h[x];j!=-1;j=ne[j])
{
st[e[j]]=true;
cout<<x<<' '<<e[j]<<endl;
}
for(int j=h[x];j!=-1;j=ne[j])
dfs(e[j]);
return 0;
}