WA on #147 求调
查看原帖
WA on #147 求调
664034
_xxxxx_楼主2024/7/20 21:02

rt,被卡掉了,独立集但是输出了相邻点。

#include <iostream>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <string.h>
#include <queue>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#define int long long
#define TIME 1e3 * clock() / CLOCKS_PER_SEC
using namespace std;
const int N = 4e5 + 10;
const int INF = 0x3f3f3f3f;
bool Mbe;
int n, m, k;
int head[N], ne[N], to[N], id;
void add(int x, int y)
{
	to[++id] = y;
	ne[id] = head[x];
	head[x] = id;
}
int dep[N];
int md = 1e9;//max dep
int s, e;
int fa[N];
bool vis[N];
void dfs(int u, int faa)
{
	dep[u] = dep[faa] + 1;
	fa[u] = faa;
	vis[u] = 1;
	for(int i = head[u]; i; i = ne[i])
	{
		int v = to[i];
		if(v == faa) continue;
		if(vis[v])
		{
			if(dep[v] < dep[u] && dep[u] - dep[u] + 1 < md)
			{
				md = dep[u] - dep[v] + 1;
				s = u;
				e = v;
			}
			continue;
		}
		dfs(v, u);
	}
}
void tree()
{
	cout << 1 << "\n";
	int cnt = 0;
	for(int i = 1; i <= n; i++)
	{
		cnt += (dep[i] & 1);
	}
	int f = 1;
	if(cnt < k / 2) f = 0;
	int ct = 0;
	for(int i = 1; i <= n; i++)
	{
		if(dep[i] % 2 == f)
		{
			cout << i << " ";
			ct++;
		}
		if(ct == (k + 1) / 2) break;
	}
	cout << "\n";
}

bool Med;
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> k;
	for(int i = 1; i <= m; i++)
	{
		int x, y;
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	dfs(1, 0);
	if(m == n - 1)
	{
		tree();
		exit(0);
	}
	if(md <= k)
	{
		cout << 2 << "\n";
		cout << md << "\n";
		for(int i = s; i != e && i != 0; i = fa[i])
		{
			cout << i << " ";	
		}
		cout << e << "\n";
		exit(0);
	}
	cout << 1 << "\n";
	int cnt = 0;
	for( ; s != fa[e] && s != fa[fa[e]] ; s = fa[fa[s]])
	{
		cout << s << " ";
		cnt++;
		if(cnt == (k + 1) / 2) break;
	}
	return 0;
}
2024/7/20 21:02
加载中...