列表

详情


NC50405. 电力

描述

求一个图删除一个点之后,联通块最多有多少。

输入描述

多组数据。第一行两个整数P,C表示点数和边数。
接下来C行每行两个整数p1,p2,表示p1与p2有边连接,保证无重边。读入以0 0结束。

输出描述

输出若干行,表示每组数据的结果。

示例1

输入:

3 3
0 1
0 2
2 1
4 2
0 1
2 3
3 1
1 0
0 0

输出:

1
2
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 317ms, 内存消耗: 1764K, 提交时间: 2022-03-14 14:28:46

#include<bits/stdc++.h>
using namespace std;
int dfn[10000],low[10000],num,root,ans; 
vector <int> g[10000];
void tarjan(const int &u){
	dfn[u] = low[u] = ++num;
	int cnt = 0;
	for (int i = 0;i < g[u].size();i++){
		int &v = g[u][i];
		if (!dfn[v]){
			tarjan(v);
			low[u] = min(low[u],low[v]);
			if (dfn[u] <= low[v])
				cnt++;
		}else low[u] = min(low[u],dfn[v]);
	}
	if (u != root && cnt)cnt++;
	ans = max(ans,cnt);
}
int main(){
	int p,c,p1,p2,s = 0,i;
	bool f;
	while (cin>>p>>c){
		if (!p && !c)
			break;
		memset(dfn,0,sizeof(dfn));
		num = 0;
		s = 0;
		ans = 0;
		while (c--){
			cin>>p1>>p2;
			g[p1].push_back(p2);
			g[p2].push_back(p1);
		}
		for (root = 0;root < p;root++)
			if (!dfn[root]){
				s++;
				tarjan(root);
			}
		cout<<s + ans - 1<<endl;
		for (i = 0;i < p;i++)
			g[i].clear();
	}
	return 0;
}

上一题