D-Router Mesh
代码一写就会,再写就忘了
这题一看,跟我最近学的求割点好像,考虑一堆,删除单独成块的点块总数-1,删除块里的点分俩,非割点总块不增减,割点删后块数+1(后来WA了一发后想到删割点增加块数可能比1多,然后就不知道怎么操作了)
链式前向星建图,背模板吧,习惯到0结束(边数组开俩倍大)
ans[i]表示删去i点后增加多少块,在求割点算法标记为1的基础上修改
如果该点不是根节点的话,ans为1
望有不抄模板的能力吧
struct team {
int to,next;
}edge[6*N];
int head[3*N],cnt,dfn[3*N],low[3*N],num,ans[3*N],now;
void addedge(int u,int v) {
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void tarjin(int u) {
dfn[u]=low[u]=++num;
ans[u]=(u!=now);
for(int i=head[u];i;i=edge[i].next) {
int v=edge[i].to;
if(!dfn[v]) {
tarjin(v);
low[u]=min(low[u],low[v]);
ans[u]+=( low[v]>=dfn[u] );
}
else low[u]=min(low[u],dfn[v]);
}
}
int main() {
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,m;cin>>n>>m;
num=cnt=0;
for(int i=1;i<=m;i++) {
int u,v;cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
int res=0;
for(int i=1;i<=n;i++) {
if(!dfn[i]) {
now=i;
tarjin(i);
res++;
}
}
for(int i=1;i<=n;i++) {
cout<<res+ans[i]-1<<(i==n?"\n":" ");
}
return 0;
}
/*
*/
fighting