Ural 1557 Network Attack
2014-03-09 00:35
267 查看
题意是在一个联通的无向图中切断两条边使其不连通,求切边的放法数。。。
具体参加曹钦翔神犇的神论文吧 http://www.docin.com/p-52577984.html
View Code
具体参加曹钦翔神犇的神论文吧 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
相关文章推荐
- URAL 1557 Network Attack 图论,连通性,tarjain,dfs建树,分类讨论 难度:2
- Ural 1557 1557. Network Attack
- 【图论】Ural 1557
- URAL 1557 连通性
- Ural 1149 - Sinus Dances
- Wrong answer of URAL 1807
- Ural 1181 Cutting a Painted Polygon
- URAL 1635. Mnemonics and Palindromes
- Ural 1114. Boxes 解题报告(组合数计算)
- ural 1640 Circle of Winter
- The journey of Ural dynamic programming
- ural 1353. Milliard Vasya's Function
- URAL 1146 Maximum Sum & HDU 1081 To The Max (DP)
- cugb.20140417 (ural 1961 - 1970)
- URAL 1011 Conductors
- URAL 1837 Isenbaev's Number
- ural 1018(树形dp)
- ural 1057 Amount of Degrees
- Ural 1971(Graphics Settings-延迟计算)
- ural 1297 后缀数组求最长回文子串