题解 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$~

浙公网安备 33010602011771号