#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int to,next;
}e[100000];
int head[10000],pre[10000],low[10000];
int cnt,dfs_clock,n,m,res;
void add_edge(int from,int to){
e[cnt].to=to;
e[cnt].next=head[from];
head[from]=cnt++;
}
void init(){
memset(head,-1,sizeof(head));
memset(pre,0,sizeof(pre));
res=cnt=dfs_clock=0;
}
void dfs(int u,int v){
low[u]=pre[u]=++dfs_clock;
for(int i=head[u];i!=-1;i=e[i].next){
int to=e[i].to;
if(to==v)
continue;
if(!pre[to]){
dfs(to,u);
low[u]=min(low[u],low[to]);
if(low[to]>pre[u])
res++;
}
else
low[u]=min(low[u],pre[to]);
}
}
void solve(){
int vis[10000],d[10000];
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
if(!pre[i]){
dfs(i,-1);
res++;
}
if(res==1){
printf("0\n");
return ;
}
for(int i=1;i<=n;i++){
if(head[i]==-1){
vis[low[i]]=1;
continue;
}
for(int j=head[i];j!=-1;j=e[j].next){
int to=e[j].to;
vis[low[i]]=vis[low[to]]=1;
if(low[i]!=low[to])
d[low[i]]++;
}
}
int num=0;
for(int i=1;i<=n;i++){
if(vis[i] && d[i] == 0){
num+=2;
}
else if(d[i] == 1)
num+=1;
}
printf("%d\n",(num+1)/2);
return ;
}
int main(){
while(~scanf("%d%d",&n,&m) ){
init();
int a,b;
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
solve();
}
}
uva 10972 添加几条变使得无向图为双联通分量
最新推荐文章于 2018-04-25 08:51:35 发布