好久没写题解了= =这次是bzoj 1051
2014-09-01 20:34
162 查看
唉= =这道题我都想到了tarjan缩点,但是没有想到最后一步啊= =我们很容易想到反向建边然后缩点,这时候我们看由多少个联通块的入度为0,如果为1个,那就输出这个块的大小,否则输出0;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10010; const int maxe = 50010; struct edge { int t; edge* next; }e[maxe * 2], *head[maxn]; int ne = 0; int n, m; void addedge(int f, int t) { e[ne].t = t, e[ne].next = head[f]; head[f] = e + ne ++; } void read() { scanf("%d%d", &n, &m); for(int i = 1; i <= m; ++ i) { int u, v; scanf("%d%d", &u, &v); addedge(v, u); } } int dfs[maxn], back[maxn]; int s[maxn], top = 0, Index = 0; bool vis[maxn]; int num = 0; int size[maxn]; int belong[maxn]; void tarjan(int now) { dfs[now] = back[now] = ++ Index; vis[now] = true; s[++ top] = now; for(edge* p = head[now]; p; p = p-> next) { if(!dfs[p-> t]) tarjan(p-> t), back[now] = min(back[now], back[p-> t]); else if(vis[p-> t] && back[now] > dfs[p-> t]) { back[now] = dfs[p-> t]; } } if(dfs[now] == back[now]) { ++ num; while(1) { belong[s[top]] = num; size[num] ++; vis[s[top]] = false; if(s[top] == now) break; top --; } top --; } } int f[maxn]; int in[maxn]; bool have[maxn]; void sov() { memset(vis, false, sizeof(false)); memset(size, 0, sizeof(size)); memset(have, 0, sizeof(have)); for(int i = 1; i <= n; ++ i) { if(!dfs[i]) tarjan(i); } memset(in, 0, sizeof(in)); int tol = 0; for(int i = 1; i <= n; ++ i) { for(edge* p = head[i]; p; p = p-> next) { if(belong[p-> t] != belong[i]) { in[belong[p-> t]] ++; } } } int pos = 0; for(int i = 1; i <= num; ++ i) { if(in[i] == 0) tol ++, pos = i; } if(tol == 1) printf("%d\n", size[pos]); else printf("0\n"); } int main() { //freopen("test.in", "r", stdin); read(); sov(); return 0; }
相关文章推荐
- 【bzoj】1051 &&【poj】2186 Popular Cows Tarjan scc
- [BZOJ] 1051: [HAOI2006]受欢迎的牛
- 【tarjan】BZOJ 1051:受欢迎的牛
- bzoj 1051: [HAOI2006]受欢迎的牛
- 【bzoj 1051】[HAOI2006]受欢迎的牛
- BZOJ 1051 受欢迎的牛
- 【强连通分量】Bzoj1051 HAOI2006 受欢迎的牛
- BZOJ 1051: [HAOI2006]受欢迎的牛【Trajan】
- [BZOJ1051][HAOI2006] 受欢迎的牛 tarjan求联通分量
- bzoj 1051 强连通分量
- bzoj 1051 受欢迎的牛-tarjan
- 【Tarjan】BZOJ1051 [HAOI2006]受欢迎的牛
- BZOJ 1051 [HAOI2006]受欢迎的牛
- BZOJ 1051-受欢迎的牛(强连通)
- 【tarjan】BZOJ 1051:受欢迎的牛
- bzoj1051 受欢迎的牛 tarjan
- bzoj 1051 [HAOI2006]受欢迎的牛
- 【BZOJ】【1051】【HAOI2005】受欢迎的牛
- BZOJ1051
- 过年啦!小B高兴的不行了,她收到了很多红包,可以实现好多的愿望呢。小B可是对商店货架上心仪的货物红眼好久了,只因囊中羞涩作罢,这次她可是要大大的shopping一番。小B想去购物时,总是习惯性的把要买的东西列在一个购买清单上,每个物品单独列一行(即便要买多个某种物品),这次也不例外。