您的位置:首页 > 其它

Ural 1557 Network Attack

2014-03-09 00:35 267 查看
题意是在一个联通的无向图中切断两条边使其不连通,求切边的放法数。。。

具体参加曹钦翔神犇的神论文吧 http://www.docin.com/p-52577984.html

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 2005;
const int maxm = 200005;
int nume,ct,n,m;
int g[maxn];
int dfn[maxn];
int s[maxn],t[maxn];
int ma[maxn][maxn];
long long ans;
vector<int>a[maxn];
int tot;
struct edge
{
int v,nxt;
};
edge e[maxm];
void init()
{
nume = 1;
memset(g,0,sizeof(g));
}
void addedge(int u,int v)
{
nume++;
e[nume].v = v;
e[nume].nxt = g[u];
g[u] = nume;
}
void dfs(int x,int edg)
{
ct++;
dfn[x] = ct;
int sum1 =0,sum2 = 0;
for (int i = g[x];i; i = e[i].nxt)
{
if (i == edg || edg == (i ^ 1)) continue;
int y = e[i].v;
if (!dfn[y])
{
a[x].push_back(y);
sum1++;
dfs(y,i);
s[x] = s[x] + s[y];
//cout<<x<<" "<<y<<" "<<s[x]<<" "<<s[y]<<endl;
for (int j = 1; j < dfn[x]; j++) ma[x][j] += ma[y][j];
}
else
{
if (dfn[y] < dfn[x])
{
sum2++;
ma[x][dfn[y]]++;
}
else sum1++;
}
}
//cout<<x<<" "<<sum1<<" "<<sum2<<endl;
s[x] = s[x] - sum1 + sum2;
}
void check(int x,int y)
{
for (int i = 0; i < a[x].size(); i++)
{
if (s[y] == s[a[x][i]] && t[a[x][i]] < dfn[y]) ans++;
check(a[x][i],y);
}
}
int main()
{
while (scanf("%d%d",&n,&m) != EOF)
{
init();
for (int i = 1; i <= n; i++) a[i].clear();
int x,y;
for (int i = 1; i <= m; i++)
{
scanf("%d%d",&x,&y);
if (x == y) continue;
addedge(x,y);
addedge(y,x);
}
memset(dfn,0,sizeof(dfn));
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
memset(ma,0,sizeof(ma));
ct = 0;
for (int i = 2;i <= n; i++) s[i] = 1;
dfs(1,-1);
//for (int i = 1; i <= n; i++) cout<<i<<" "<<s[i]<<endl;
for (int i = 2; i <= n; i++)
for (int j = dfn[i] - 1; j >= 1; j--)
if (ma[i][j] > 0)
{
t[i] = j;
break;
}
ans = 0;
tot = 0;
for (int i = 2; i <= n; i++)
{
if (s[i] == 1) tot++;
else
{
if (s[i] == 2) ans++;
check(i,i);
}
}
long long tmp = tot;
tmp = tmp * (m - tmp) + tmp * (tmp - 1) / 2;
ans = ans + tmp;
printf("%I64d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: