zoukankan      html  css  js  c++  java
  • Critical Links(连通图 桥)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=67418#problem/C

    求桥裸题:

    这个模板好像和KB的还不太一样,有时间研究下

    #include <map>
    #include <set>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 100010;
    const int M = (N << 2);
    
    struct node
    {
    	int next;
    	int to;
    //	int id;
    }edge[M];
    
    struct BRIDGE
    {
    	int u;
    	int v;
    }bridge[M];
    
    int head[N];
    int DFN[N];
    int low[N];
    int st[N];
    bool instack[N];
    int tot, top, ord, sccnum, cnt;
    
    void init ()
    {
    	memset (head, -1, sizeof(head));
    	memset (DFN, -1, sizeof(DFN));
    	memset (low, 0, sizeof(low));
    	memset (instack, 0, sizeof(instack));
    	tot = top = cnt = sccnum = ord = 0;
    }
    
    void addedge (int from, int to)
    {
    	edge[tot].to = to;
    //	edge[tot].id = id;
    	edge[tot].next = head[from];
    	head[from] = tot++;
    }
    
    int cmp (BRIDGE a, BRIDGE b)
    {
    	if (a.u == b.u)
    	{
    		return a.v < b.v;
    	}
    	return a.u < b.u;
    }
    
    void tarjan (int u, int fa)
    {
    	DFN[u] = low[u] = ++ord;
    	instack[u] = 1;
    	st[top++] = u;
    	for (int i = head[u]; ~i; i = edge[i].next)
    	{
    		int v = edge[i].to;
    		if (v == fa)
    		{
    			continue;
    		}
    		if (DFN[v] == -1)
    		{
    			tarjan (v, u);
    			low[u] = min (low[v], low[u]);
    			if (low[v] > DFN[u])
    			{
    				bridge[++cnt].u = u;
    				bridge[cnt].v = v;
    				if (bridge[cnt].u > bridge[cnt].v)
    				{
    					swap (bridge[cnt].u, bridge[cnt].v);
    				}
    			}
    		}
    		else if (instack[v])
    		{
    			low[u] = min (low[u], DFN[v]);
    		}
    	}
    	if (low[u] == DFN[u])
    	{
    		++sccnum;
    		int v;
    		do
    		{
    			v = st[--top];
    			instack[v] = 0;
    		}while (u != v);
    	}
    }
    
    void solve (int n)
    {
    	for (int i = 1; i <= n; ++i)
    	{
    		if (DFN[i] == -1)
    		{
    			tarjan(i, -1);
    		}
    	}
    	sort (bridge + 1, bridge + cnt + 1, cmp);
    	printf("%d critical links
    ", cnt);
    	for (int i = 1; i <= cnt; ++i)
    	{
    		printf("%d - %d
    ", bridge[i].u - 1, bridge[i].v - 1);
    	}
    	printf("
    ");
    }
    
    int main()
    {
    	int n;
    	int u, v;
    	int num;
    	while (~scanf("%d", &n))
    	{
    		if (n == 0)
    		{
    			printf("0 critical links
    
    ");
    			continue;
    		}
    		init();
    		for (int i = 1; i <= n; ++i)
    		{
    			scanf("%d", &u);
    			++u;
    			getchar();
    			getchar();
    			scanf("%d", &num);
    			getchar();
    			while (num--)
    			{
    				scanf("%d", &v);
    				++v;
    				addedge (u, v);
    			}
    		}
    		solve (n);
    	}
    	return 0;
    }


  • 相关阅读:
    display ntp-service sessions
    display ntp-service status
    MySQL与telnet安装
    YL_组播_IGMPv2-v3
    YL_组播_PIM-DM协议原理
    YL_组播_IGMP协议原理
    IIS发布站点问题
    css 定位及遮罩层小技巧
    MYSQL查询某字段中以逗号分隔的字符串的方法
    零度
  • 原文地址:https://www.cnblogs.com/zswbky/p/6717967.html
Copyright © 2011-2022 走看看