2018.09.15 poj2117 Electricity

3824 단어 #tarjan절점
전송문은 사실 그림 하나를 구하고 점 하나를 삭제한 후에 연결 블록이 가장 많다.그냥 타잔이 해답을 업데이트해 달라고 하면 돼.그러나 원도가 반드시 연결되는 것은 아니니 주의해라.코드:
#include
#include
#include
#include
#define N 10005
using namespace std;
int m,n,ans,dfn[N],low[N],tot=0,cut[N];
vector<int>e[N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline void tarjan(int p,int fa){
    dfn[p]=low[p]=++tot;
    for(int i=0;iint v=e[p][i];
        if(!dfn[v]){
            tarjan(v,p),low[p]=min(low[p],low[v]);
            if(low[v]>=dfn[p])++cut[p];
        }
        else if(dfn[v]int main(){
    while(scanf("%d%d",&n,&m)==2&&n){
        memset(cut,0,sizeof(cut)),memset(dfn,0,sizeof(dfn)),tot=0,ans=-1;
        for(int i=1;i<=n;++i)e[i].clear();
        for(int i=1;i<=m;++i){
            int u=read()+1,v=read()+1;
            e[u].push_back(v),e[v].push_back(u); 
        }
        int tmp=0;
        for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i,0),++tmp,--cut[i];
        for(int i=1;i<=n;++i)ans=max(ans,cut[i]);
        printf("%d
"
,ans+tmp); } return 0; }

좋은 웹페이지 즐겨찾기