1. 程式人生 > >Poj2117 Electricity(電力)

Poj2117 Electricity(電力)

inline total dig 原來 getc 記錄 mat tar div

試題描述
求一個圖刪除一個點之後,聯通塊最多有多少。
輸入
多組數據。第一行兩個整數 P,C 表示點數和邊數。
接下來 C 行每行兩個整數 p1,p2,表示 p1 與 p2 有邊連接,保證無重邊。讀入以 0 0 結束。
輸出
輸出若幹行,表示每組數據的結果。
輸入示例
3 3
0 1
0 2
2 1
4 2
0 1
2 3
3 1
1 0
0 0
輸出示例
1
2
2
其他說明
數據範圍與提示
1≤P≤10000,C≥0,0≤p1,p2<P

割邊的板子

不會的話點這裏:https://www.cnblogs.com/WWHHTT/p/9745499.html

記錄每一個點去掉之後會增加幾個聯通塊

再和原來的個數相加

下面給出代碼:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string
> #include<cmath> #include<cstdio> #include<cstdlib> using namespace std; inline int rd(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch==-) f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-0; return x*f; } inline void write(int
x){ if(x<0) putchar(-),x=-x; if(x>9) write(x/10); putchar(x%10+0); return ; } int n,m; int head[100006]; int nxt[200006],to[200006]; int total=0; void add(int x,int y){ total++; to[total]=y; nxt[total]=head[x]; head[x]=total; return ; } int dfn[100006],low[100006]; int tot=0; int num[100006]; void Tarjan(int x,int fa){ dfn[x]=low[x]=++tot; for(int e=head[x];e;e=nxt[e]){ if(!dfn[to[e]]){ Tarjan(to[e],x); low[x]=min(low[x],low[to[e]]); if(low[to[e]]>=dfn[x]) num[x]++; } else if(to[e]!=fa) low[x]=min(low[x],dfn[to[e]]); } return ; } int main(){ while(1){ memset(dfn,0,sizeof(dfn)); memset(head,0,sizeof(head)); memset(num,0,sizeof(num)); total=tot=0; n=rd(); m=rd(); if(!n&&!m) break; for(int i=1;i<=m;i++){ int x=rd(),y=rd(); add(x,y),add(y,x); } int cnt=0; int maxn=-999999; for(int i=0;i<n;i++){ if(!dfn[i]){ cnt++; Tarjan(i,-1); num[i]--; } } for(int i=0;i<n;i++){ maxn=max(maxn,num[i]); } write(cnt+maxn); puts(""); } return 0; }

Poj2117 Electricity(電力)