• P2863 [USACO06JAN]牛的舞会The Cow Prom


    题目描述

    约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞.

    只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一个圆形的水池.奶牛们围在池边站好, 顺时针顺序由1到N编号.每只奶牛都面对水池,这样她就能看到其他的每一只奶牛.

    为了跳这种圆舞,她们找了 M(2<M< 50000)条绳索.若干只奶牛的蹄上握着绳索的一端, 绳索沿顺时针方绕过水池,另一端则捆在另一些奶牛身上.这样,一些奶牛就可以牵引另一些奶 牛.有的奶牛可能握有很多绳索,也有的奶牛可能一条绳索都没有.

    对于一只奶牛,比如说贝茜,她的圆舞跳得是否成功,可以这样检验:沿着她牵引的绳索, 找到她牵引的奶牛,再沿着这只奶牛牵引的绳索,又找到一只被牵引的奶牛,如此下去,若最终 能回到贝茜,则她的圆舞跳得成功,因为这一个环上的奶牛可以逆时针牵引而跳起旋转的圆舞. 如果这样的检验无法完成,那她的圆舞是不成功的.

    如果两只成功跳圆舞的奶牛有绳索相连,那她们可以同属一个组合.

    给出每一条绳索的描述,请找出,成功跳了圆舞的奶牛有多少个组合?

    输入输出样例

    输入样例#1: 复制
    5 4
    2 4
    3 5
    1 2
    4 1
    输出样例#1: 复制
    1

    应该算是tarjin算法的模板题。
    我们求强连通分量时要记录有几个点在这个强连通分量内,如果只有一个点,就代表没有匹配成功,不能记答案。
     1 #include <bits/stdc++.h>
     2 #define N 50005
     3 using namespace std;
     4 int n, m;
     5 int dfn[N], law[N], vis[N];
     6 int ans = 0, times = 1;
     7 vector<int> v[N];
     8 stack<int> s;
     9 
    10 void tarjin(int t){
    11     dfn[t] = law[t] = times++;
    12     // vis[t] = 1;
    13     s.push(t);
    14     for(int i = 0; i < v[t].size(); i++){
    15         if(!dfn[v[t][i]]){
    16             tarjin(v[t][i]);
    17             law[t] = min(law[t], law[v[t][i]]);
    18         }else{
    19             if(dfn[v[t][i]]){
    20                 law[t] = min(law[t], dfn[v[t][i]]);
    21             }
    22         }
    23     }
    24 
    25     if(dfn[t] == law[t]){
    26         int cnt = 1;
    27         while(s.top() != t){
    28             s.pop();
    29             cnt++;
    30         }
    31         s.pop();
    32         if(cnt > 1){
    33             ans ++;
    34         }
    35     }
    36 }
    37 
    38 
    39 int main(){
    40     cin >> n >> m;
    41     int x, y;
    42     for(int i = 0; i < m ; i++){
    43         cin >> x  >> y;
    44         v[x].push_back(y);
    45     }
    46     for(int i = 1; i <= n; i++){
    47         if(!dfn[i])
    48             tarjin(i);
    49     }
    50     cout << ans << endl;
    51     return 0;
    52 }
  • 相关阅读:
    洛谷P1022计算器的改良(字符串+各种细节坑点考虑)
    hdu5974Math Problem(数学,思维,公式,取巧猜)
    牛客练习赛26A平面(数学公式)
    洛谷P1217回文质数(特判筛选,取巧判断顺序)
    尺取法
    51nod1006最长公共子序列(lcs输出路径)
    51nod1175区间第k大(小)数(主席树模板)
    51nod1174区间中最大的数(rmq模板或线段树 && 线段树标准模板)
    51nod1094和为k连续区间(前缀和+map判断优化)
    矩阵快速幂求递推数列
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/10505509.html
Copyright © 2020-2023  润新知