zoukankan      html  css  js  c++  java
  • UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】

    Road Networks
    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

    Description

    Download as PDF
     


    There is a road network comprised by M<tex2html_verbatim_mark> roads and N<tex2html_verbatim_mark> cities. For convenience, we use {1, 2,..., N}<tex2html_verbatim_mark> to denote the N<tex2html_verbatim_mark> cities. Each road between two cities i<tex2html_verbatim_mark> and j<tex2html_verbatim_mark> , where 1$ le$i<tex2html_verbatim_mark> , j$ le$N<tex2html_verbatim_mark> and i$ 
eq$j<tex2html_verbatim_mark> , has two types: One type is bidirectional, which allows a citizen to drive a car from i<tex2html_verbatim_mark> to j<tex2html_verbatim_mark> (denoted by i$ leadsto$j<tex2html_verbatim_mark> ) and from j<tex2html_verbatim_mark> to i<tex2html_verbatim_mark> (denoted by j$ leadsto$i<tex2html_verbatim_mark> ). The other type is unidirectional, which allows a citizen to drive a car following exactly one direction, either from i<tex2html_verbatim_mark> to j<tex2html_verbatim_mark> or from j<tex2html_verbatim_mark> to i<tex2html_verbatim_mark> .

    We say that City j<tex2html_verbatim_mark> is reachable from City i<tex2html_verbatim_mark> if one can drive a car from i<tex2html_verbatim_mark> to j<tex2html_verbatim_mark> , visiting a sequence of cities c1c2,..., ck<tex2html_verbatim_mark> for k$ ge$ 0<tex2html_verbatim_mark> , such thati$ leadsto$c1$ leadsto$c2$ leadsto$...$ leadsto$ck$ leadsto$j<tex2html_verbatim_mark> . (Every city is always reachable from itself.) A region is a maximal set of cities so that the following mutually reachable property holds: for two arbitrary cities i<tex2html_verbatim_mark> and j<tex2html_verbatim_mark> , i<tex2html_verbatim_mark> is reachable from j<tex2html_verbatim_mark> and j<tex2html_verbatim_mark> is also reachable from i<tex2html_verbatim_mark> . The adjective ``maximal" means that if we include any other city in the given region, the mutually reachable property cannot be retained. Given a road network, your task is to write a computer program to compute the number of regions in the road network.


    Technical Specification

    1. We use {1, 2,..., N}<tex2html_verbatim_mark> to denote the N<tex2html_verbatim_mark> cities.
    2. M$ le$2000<tex2html_verbatim_mark> is a non-negative integer
    3. N$ le$1000<tex2html_verbatim_mark> is a positive integer.
    4. If a road between i<tex2html_verbatim_mark> and j<tex2html_verbatim_mark> is bidirectional, then we use two order pairs (ij)<tex2html_verbatim_mark> and (ji)<tex2html_verbatim_mark> to represent it. Otherwise, if a road between i<tex2html_verbatim_mark>and j<tex2html_verbatim_mark> is unidirectional from i<tex2html_verbatim_mark> to j<tex2html_verbatim_mark> (respectively, j<tex2html_verbatim_mark> to i<tex2html_verbatim_mark> ), we use ( i<tex2html_verbatim_mark> , j<tex2html_verbatim_mark> ) (respectively, ( j<tex2html_verbatim_mark> , i<tex2html_verbatim_mark> )) to represent it.

    Input

    The input consists of a number of test cases. The first line of the input file contains an integer indicating the number of test cases to follow. Each test case consists of a road network, which has the following format: the first line of each test case contains two numbers, N<tex2html_verbatim_mark>and M<tex2html_verbatim_mark> , separated by a single space. The next M<tex2html_verbatim_mark> lines contain the description of M<tex2html_verbatim_mark> roads such that one line contains two cities representing an order pair (ij)<tex2html_verbatim_mark> . Each line is represented by two positive numbers separated by a single space; the first number representing the former element in the order pair and the second number representing the latter element in the order pair. A ` 0' at the (M+ 2)<tex2html_verbatim_mark> -th line of each test case (except for the last test case) indicates the end of this test case.

    The next test case starts after the previous ending symbol `0'. Finally, a `-1' signals the end of the whole inputs.

    Output

    The output contains one line for each test case. Each line contains an integer, which is the number of the regions in the given road network.

    Sample Input

    2 
    3 2
    1 2
    1 3
    0 
    3 3
    1 2
    2 3
    3 1
    -1
    

    Sample Output

    3 
    1



    题目大意:给你n个点,m条有向边。问你这个图中的scc个数。

    解题思路:求强连通分量的模板题,Tarjan算法水过。


    /*
        Tarjan 
        求强连通分量个数
    */
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<stack>
    #include<vector>
    #include<queue>
    using namespace std;
    const int maxn = 1e5+200;
    vector<int>G[maxn];
    int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
    stack<int>S;
    void dfs(int u){
        pre[u] = lowlink[u] = ++dfs_clock;
        S.push(u);
        for(int i = 0;i < G[u].size(); i++){
            int v = G[u][i];
            if(!pre[v]){
                dfs(v);
                lowlink[u] = min(lowlink[u], lowlink[v]);
            }else if(!sccno[v]){
                lowlink[u] = min(lowlink[u], pre[v]);
            }
        }
        if(lowlink[u] == pre[u]){
            scc_cnt++;
            for(;;){
                int x = S.top(); S.pop();
                sccno[x] = scc_cnt;
                if(x == u) break;
            }
        }
    }
    void find_scc(int n){
        dfs_clock = scc_cnt = 0;
        while(!S.empty()) S.pop();
        memset(sccno , 0, sizeof(sccno));
        memset(pre, 0, sizeof(pre));
        for(int i = 1; i <= n; i++){
            if(!pre[i]) dfs(i);
        }
    }
    int main(){
        int T,n,m;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&m);
            int a,b;
            for(int i = 0; i < m; i++){
                scanf("%d%d",&a,&b);
                G[a].push_back(b);
            }
            scanf("%d",&a);
            find_scc(n);
            printf("%d
    ",scc_cnt);
            for(int i = 0; i <= n; i++){
                G[i].clear();
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    用TortoiseSVN忽略文件或文件夹(ignore)(网络摘抄记录)
    GridView解决同一行item的高度不一样,如何同一行统一高度问题?
    解决android studio引用远程仓库下载慢(转)
    Databinding在自定义ViewGroup中如何绑定view
    (转 )【Android那些高逼格的写法】InvocationHandler与代理模式
    (转)秒懂,Java 注解 (Annotation)你可以这样学
    View拖拽 自定义绑定view拖拽的工具类
    bcrypt对密码加密的一些认识(学习笔记)
    Node.js+Koa开发微信公众号个人笔记(三)响应文本
    Node.js+Koa开发微信公众号个人笔记(二)响应事件
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4887059.html
Copyright © 2011-2022 走看看