POJ3352
边-双连通模板题
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
//typedef __int64 LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
const int mod=9999991;
const int NN=1005;
const int MM=2000010;
/* ****************** */
struct G
{
int u,v,next;
bool fg;
}E[NN*2];
int p[NN],T;
int dfn[NN],low[NN],tsp;
int sta[NN],sta_top;
int id[NN],id_cnt;
int du[NN];
void add(int u,int v)
{
E[T].u=u;
E[T].v=v;
E[T].next=p[u];
E[T].fg=false;
p[u]=T++;
}
int findid(int x)
{
if(id[x]==x)return x;
return id[x]=findid(id[x]);
}
void tarjan(int u)
{
int i,v;
dfn[u]=low[u]=++tsp;
sta[++sta_top]=u;
for(i=p[u];i+1;i=E[i].next)
{
if(E[i].fg)
continue;
v=E[i].v;
if(!dfn[v])
{
E[i].fg=true;
E[i^1].fg=true;
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
id_cnt++;
do
{
v=sta[sta_top--];
id[v]=u;
}while(v!=u);
}
}
int main()
{
int n,m,u,v,i,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(p,-1,sizeof(p));
T=0;
while(m--)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(i=1;i<=n;i++)
{
dfn[i]=low[i]=0;
id[i]=i;
}
tsp=0;
sta_top=0;
id_cnt=0;
tarjan(1);
for(i=1;i<=n;i++)
{
du[i]=0;
}
for(i=0;i<T;i+=2)
{
u=findid(E[i].u);
v=findid(E[i].v);
if(u!=v)
{
du[u]++;
du[v]++;
}
}
ans=0;
for(i=1;i<=n;i++)
if(du[i]==1)
ans++;
printf("%d\n",(ans+1)/2);
}
return 0;
}
HDU 2767
强连通模板题
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
//typedef __int64 LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
const int mod=9999991;
const int NN=20005;
const int MM=50010;
/* ****************** */
struct G
{
int u,v,next;
}E[MM];
int p[NN],T;
int dfn[NN],low[NN],tsp;
int sta[NN],sta_top;
bool in_sta[NN];
int id[NN],id_cnt;
int ind[NN],outd[NN];
void add(int u,int v)
{
E[T].u=u;
E[T].v=v;
E[T].next=p[u];
p[u]=T++;
}
void scc(int u)
{
int i,v;
dfn[u]=low[u]=++tsp;
sta[++sta_top]=u;
in_sta[u]=true;
for(i=p[u];i+1;i=E[i].next)
{
v=E[i].v;
if(dfn[v]==0)
{
scc(v);
low[u]=min(low[u],low[v]);
}
else if(in_sta[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
id_cnt++;
for(;;)
{
v=sta[sta_top--];
id[v]=id_cnt;
in_sta[v]=false;
if(v==u)break;
}
}
}
int main()
{
int cas,n,m;
int u,v,i,ans1,ans2;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&m);
memset(p,-1,sizeof(p));
T=0;
while(m--)
{
scanf("%d%d",&u,&v);
add(u,v);
}
for(i=1;i<=n;i++)
{
dfn[i]=low[i]=0;
id[i]=-1;
in_sta[i]=false;
}
tsp=0;
sta_top=0;
id_cnt=0;
for(i=1;i<=n;i++)
{
if(dfn[i]==0)
scc(i);
}
if(id_cnt==1)
{
puts("0");
continue;
}
for(i=1;i<=id_cnt;i++)
ind[i]=outd[i]=0;
for(i=0;i<T;i++)
{
u=id[ E[i].u ];
v=id[ E[i].v ];
if(u!=v)
{
outd[u]++;
ind[v]++;
}
}
ans1=ans2=0;
for(i=1;i<=id_cnt;i++)
{
if(ind[i]==0)
ans1++;
if(outd[i]==0)
ans2++;
}
printf("%d\n",max(ans1,ans2));
}
return 0;
}