3799887_wa.cpp

来自「北大大牛代码 1240道题的原代码 超级权威」· C++ 代码 · 共 114 行

CPP
114
字号
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

struct node
{
	int tar;
	int visited;
	node (int t, int v)	:tar(t), visited(v) {}
};

vector < vector <node> > map;

int p, c;
int dfn[10000];
int fat[10000];
int low[10000];
int num;

int min(int a, int b)
{
	return a < b ? a : b;
}

void dfs(int u, int fa)
{
	int i;

	dfn[u] = low[u] = num++;
	fat[u] = fa;
	for (i = 0; i < map[u].size(); i++)
	{
		if (dfn[map[u][i].tar] == -1)
		{
			map[u][i].visited = 1;
			dfs(map[u][i].tar, u);
			low[u] = min(low[u], low[map[u][i].tar]);
		}
		else
		{
			if (map[u][i].tar != fa)
			{
				low[u] = min(low[u], dfn[map[u][i].tar]);
			}
		}
	}
}

int main()
{
	int i, j;
	int u, v;

	while (true)
	{
		scanf("%d%d", &p, &c);
		if (p == 0 && c == 0)
		{
			break;
		}
		map.resize(p);
		for (i = 0; i < p; i++)
		{
			map[i].clear();
		}
		for (i = 0; i < c; i++)
		{
			scanf("%d%d", &u, &v);
			map[u].push_back(node(v, 0));
			map[v].push_back(node(u, 0));
		}
		num = 0;
		int tot = 0;
		int ans = 0;
		memset(dfn, -1, sizeof(dfn));
		for (i = 0; i < p; i++)
		{
			if (dfn[i] == -1)
			{
				dfs(i, -1);
				tot++;
			}
		}
		for (i = 0; i < p; i++)
		{
			int mark = 0;
			for (j = 0; j < map[i].size(); j++)
			{
				if (map[i][j].tar == fat[i])
					continue;
				if (low[map[i][j].tar] < dfn[i])
				{
					mark = 1;
					break;
				}
			}
			if (mark == 1)
				continue;
			int tmp = tot - 1 + (fat[i] != -1);
			for (j = 0; j < map[i].size(); j++)
			{
				if (map[i][j].tar == fat[i])
					continue;
				tmp += map[i][j].visited;
			}
			if (tmp > ans)
				ans = tmp;
		}
		printf("%d\n", ans);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?