·无向图转有向图,经典而美妙

·英文题,述大意:

      输入一个无向图(不一定联通),现在询问:是否可以将每一条无向边定向,并为新图添加最少的新的有向边,使得原图强联通。

·分析:

      静静地分析 #include<stdio.h>
#include<algorithm>
#include<cstring>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,x) for(int i=a[x],v=e[i].v;i>-1;i=e[i].next,v=e[i].v)
#define mem(a,b) memset(a,b,sizeof(a))
;];
int n,m,head[N],k,low[N],dfn[N],dfs_clock,num,ans,degree[N];bool Name[N];
void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
void Sign(int u,int fa)
{
low[u]=dfn[u]=++dfs_clock;fo(i,head,u)if(v!=fa){if(!dfn[v]){
Sign(v,u);low[u]=min(low[u],low[v]);if(dfn[u]<low[v])num++;
}else low[u]=min(low[u],dfn[v]);}
}
int main(){while(~scanf("%d%d",&n,&m))
{
mem(head,-);mem(dfn,);mem(low,);mem(Name,);
mem(degree,);dfs_clock=num=ans=k=;
go(i,,m){int u,v;scanf("%d%d",&u,&v);ADD(u,v);ADD(v,u);}
go(u,,n));){puts(");continue;}

go(u,,n){Name[low[u]]=;fo(i,head,u)Name[low[v]]=,
degree[low[u]]+=(low[u]!=low[v]);}
go(u,,n)ans+=(!degree[u]&&Name[u])*,ans+=degree[u]==;
printf()/);
};}//Paul_Guderian