传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2730
思路可以参考Po姐姐博客
传送门 http://blog.csdn.net/popoqqq/article/details/40784625
我的代码是处理了独立点的情况,然而数据并不给力
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define N 1005
#define V e[i].v
using namespace std;
struct edge{int v,n;}e[N<<1];
int tot,cnt,ans1,s[N],low[N],dep[N],stack[N],belong[N],top,n,m;
long long ans2;
inline void push(const int &u,const int &v){e[++tot]=(edge){v,s[u]};s[u]=tot;}
inline void prepare()
{
memset(dep,0,sizeof(dep));
memset(belong,0,sizeof(belong));
memset(s,0,sizeof(s));
n=cnt=ans1=tot=0;ans2=1;
}
void dfs(const int &u)
{
dep[u]=low[u]=++cnt;
for (int i=s[u];i;i=e[i].n) if (dep[V]) low[u]=min(low[u],dep[V]);
else
{
dfs(V);
low[u]=min(low[u],low[V]);
if (dep[u]<=low[V]) belong[u]++;
}
}
void solve(const int &u)
{
dep[u]=low[u]=++cnt;
stack[++top]=u;
for (int i=s[u];i;i=e[i].n) if (dep[V]) low[u]=min(low[u],dep[V]);
else
{
solve(V);
low[u]=min(low[u],low[V]);
if (dep[u]<=low[V])
{
int t,tmp=0,size=1;
do{
t=stack[top--];
if (1<belong[t]) ++tmp;
++size;
}while(t!=V);
if (1<belong[u]) ++tmp;
if (!tmp) ans1+=2,ans2*=size*(size-1)>>1;
if (tmp==1) ans1++,ans2*=size-1;
}
}
}
int main()
{
for (int T=1;;T++)
{
scanf("%d",&m);
if (m==0) return 0;
prepare();
for (int i=1,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v);
push(u,v);push(v,u);
n=max(n,max(u,v));
}
for (int i=1;i<=n;i++) if (!dep[i]) dfs(i);
else belong[i]++;
memset(dep,0,sizeof(dep));cnt=0;
for (int i=1;i<=n;i++) if (!dep[i]) solve(i);
for (int i=1;i<=n;i++) if (!s[i]) ans1++;
printf("Case %d: %d %lld\n",T,ans1,ans2);
}
}