Poj2117 Electricity(電力)
阿新 • • 發佈:2018-10-20
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 |
其他說明 |
數據範圍與提示 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(intx){ 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(電力)