题解 P2863 【[USACO06JAN]牛的舞会The Cow Prom】

简介: 题目链接 赤裸裸的板子,就加一个特判就行。直接上代码 #include #include #include using namespace std; bool ins[10000000];//记录入没入栈。

题目链接

赤裸裸的板子,就加一个特判就行。直接上代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
bool ins[10000000];//记录入没入栈。
bool typ[10000000];//特判*1,是强连通分量就直接过了。
int top;int ans[10000000];
int stack[10000000];//手写栈。
void push(int x)//手写栈ing.
{
    ins[x]=true;
    stack[++top]=x;
    return ;
}
void pop()
{
    ins[stack[top]]=false;
    top--;
    return ;
}
struct data{
    int v;int next;
}edge[10000000];
int cnt;int alist[10000000];
void add(int u,int v)//继续手写结构体。
{
    edge[++cnt].v=v;
    edge[cnt].next=alist[u];
    alist[u]=cnt;
}
int dfn[100000];int dfu;//dfn作为x的入栈序号。
int low[1000000];int res=0;
void dfs(int x)//dfs
{
    dfn[x]=++dfu;//记录搜索序号
    push (x);
    low[x]=dfn[x];
    int next=alist[x];
    while(next)
    {
        int v=edge[next].v;
        if(ins[v]==true)//被搜过就不用再搜了
        {
            low[x]=min(low[x],low[v]);
        }
        else if(ins[v]==false)
        {
            dfs(v);
            low[x]=min(low[x],low[v]);
        }
        next=edge[next].next;
    }
    if(dfn[x]==low[x])//如果搜回来了。
    {
        while(low[stack[top]]==low[x])
        {
            typ[stack[top]]=true;
            pop();
            ans[x]++;
        }
        if(ans[x]>1) res++;//想要转圈的话必须要两个人及以上。
    }
    return;
}
int n,m;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int n1,m1;
        scanf("%d%d",&n1,&m1);//不解释。
        add(n1,m1);
    }
    for(int i=1;i<=n;i++)
    {
        if(typ[i]==1) continue;//要是在扫过的强连通分量里面直接过。
        else dfs(i);
    }
    printf("%d",res);
    return 0;//程序拜拜
}

 

相关文章
|
C语言 C++
【九章斩题录】从尾到头打印链表(JZ6)
【九章斩题录】从尾到头打印链表(JZ6)
61 0
|
机器学习/深度学习
【Leetcode】面试题 08.05. 递归乘法、HJ55 挑7
目录 面试题 08.05. 递归乘法 HJ55 挑7
60 0
|
8月前
|
C++
【PTA】L1-019 谁先倒 (C++)
【PTA】L1-019 谁先倒 (C++)
94 0
【PTA】L1-019 谁先倒 (C++)
|
8月前
|
算法
OJ刷题:《剑指offer》之左旋字符串!
OJ刷题:《剑指offer》之左旋字符串!
|
8月前
牛客网 KY11 二叉树遍历
牛客网 KY11 二叉树遍历
55 0
codeforces1209——D.Cow and Snacks(并查集)
codeforces1209——D.Cow and Snacks(并查集)
116 0
PTA 谁先倒
L1-019 谁先倒 分数 15 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
171 0
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2722-[USACO3.1]总分 Score Inflation(完全背包)
洛谷P2722-[USACO3.1]总分 Score Inflation(完全背包)
洛谷P2722-[USACO3.1]总分 Score Inflation(完全背包)