题解 UVA315 【Network】

UVA315 Network

传送门

思路

题意翻译真良心

这道题给出一张有 $n$ 个点的无向图,求图的割点数。

这道题倒是比【模板】割点还少求割点是什么,不过输入太恶心了,我们可以对于每一个输入的 $u$ 开一个 $stringstream$ (字符串流)来存储这一行的 $v$ ,建完图之后就可以常规 $Tarjan$ 求割点了。

$AC\;Code:$

#include<bits/stdc++.h>
using namespace std;
#define ll long long
namespace IO{
    // read(),write();
}using namespace IO;
int n,m,cnt,tim,ans,head[20001],dfn[20001],low[20001];
bool cut[20001];
struct Edge{
    int nxt,to,fr;
}edge[200001];
inline void add(int u,int v){
    cnt++;
    edge[cnt].fr=u;
    edge[cnt].to=v;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}
void Tarjan(int x,int f){
    low[x]=dfn[x]=++tim;
    int tot=0;
    for(int i=head[x];i;i=edge[i].nxt){
        int t=edge[i].to;
        if(!dfn[t]){
            Tarjan(t,x);
            low[x]=min(low[x],low[t]);
            if(low[t]>=dfn[x]&&f!=x){
                cut[x]=true;
            }else{
                tot++;
            }
        }else low[x]=min(low[x],dfn[t]);
    }
    if(tot>=2&&x==f){//割点
        cut[x]=true;
    }
}
inline void init(){
    for(int i=1;i<=n;i++){
        head[i]=dfn[i]=low[i]=cut[i]=0;
    }
    cnt=tim=ans=0;
}
int main(){
    for(;n=read();init()){
        string s;//处理输入
        for(int u=read(),v;u;u=read()){
            stringstream ss;
            getline(cin,s);
            ss.str(s);
            while(!ss.eof()){
                ss>>v;
                add(u,v);
                add(v,u);
            }
        }
        for(int i=1;i<=n;i++){//Tarjan
            if(!dfn[i]){
                Tarjan(i,i);
            }
        }
        for(int i=1;i<=n;i++){
            if(cut[i]){
                ans++;
            }
        }
        write(ans);
        out[len++]='\n';
    }
    fwrite(out,1,len,stdout);
    return 0;
}

那就再见了 $qwq$~

posted @ 2020-12-11 18:42  ffffyc  阅读(13)  评论(0)    收藏  举报  来源