# 去掉每个点以后的连通分支数

4 2
1 2
1 3


3 2 2 1


#include <cstdio>
#include <cstring>
#include <vector>
#include<iostream>
#include <algorithm>
#define maxd 300000+5
using namespace std;
int low[maxd],num[maxd],dfn=0,tot=0;
bool vis[maxd];
vector<int>G[maxd];
vector<int>Gra[maxd];
int block[maxd];
bool iscut[maxd];
void dfs(int u){
int rc=0;
num[u]=low[u]=++dfn;
for (int i=0;i<G[u].size();i++){
int v=G[u][i];
if (!num[v]){
dfs(v);

low[u]=min(low[u],low[v]);
if (low[v]>=num[u]) {
block[u]++;
}

}
else low[u]=min(low[u],num[v]);
}
}//block[0]代表原图的连通分支数
void dfs2(int u){
int rc=0;
num[u]=low[u]=++dfn;
for (int i=0;i<Gra[u].size();i++){
int v=Gra[u][i];
vis[v]=true;
if (!num[v]){
dfs2(v);

low[u]=min(low[u],low[v]);
if (low[v]>=num[u]) {
block[u]++;
}

}
else low[u]=min(low[u],num[v]);
}
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i) block[i]=1;

for(int i=1;i<=n;++i){
G[0].push_back(i);
G[i].push_back(0);
}

for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
Gra[u].push_back(v);
Gra[v].push_back(u);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(0);
memset(low,0,sizeof(low));
memset(num,0,sizeof(num));
dfn=0;
for(int i=1;i<=n;++i){
block[i]=block[0];
}
for(int i=1;i<=n;++i){
if(!vis[i]){
block[i]--;
dfs2(i);
}
}
for(int i=1;i<=n;++i){
printf("%d ",block[i]);
}
return 0;
}

#include <cstdio>
#include <cstring>
#include <vector>
#include<iostream>
#include <algorithm>
#define maxd 300000+5
using namespace std;
int low[maxd],num[maxd],dfn=0,tot=0;
int numof=0;
bool vis[maxd];
vector<int>Gra[maxd];
int block[maxd];
bool iscut[maxd];
void dfs2(int u){
if(!vis[u]) numof++;
int rc=0;
num[u]=low[u]=++dfn;
for (int i=0;i<Gra[u].size();i++){
int v=Gra[u][i];
vis[v]=true;
if (!num[v]){
dfs2(v);

low[u]=min(low[u],low[v]);
if (low[v]>=num[u]) {
block[u]++;
}

}
else low[u]=min(low[u],num[v]);
}
}//block[0]代表原图的连通分支数
int main() {
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
Gra[u].push_back(v);
Gra[v].push_back(u);
}
memset(low,0,sizeof(low));
memset(num,0,sizeof(num));
dfn=0;
for(int i=1;i<=n;++i){
if(!vis[i]){
block[i]--;
dfs2(i);
}
}
for(int i=1;i<=n;++i) block[i]+=numof;
for(int i=1;i<=n;++i){
printf("%d ",block[i]);
}
return 0;
}

• 点赞
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏
• 打赏

打赏

今天也吃瓜

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 举报
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文
07-17 3073
08-30 1243

06-16 608
04-28 1165
07-18 2029
08-29 2727
07-10 59