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; }