ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G (tarjan缩点)

2022-06-10 21:34:55  阅读:147  来源: 互联网

标签:缩点 tarjan 洛谷 int 出度 ++ dfn low vv


在本题中很明显,给你一个有向图,要用tarjan缩点。

缩点后,一头牛要受到所有牛的欢迎,那么该点的出度要为0,这是容易证明的:如果该点还有出度,比如a连向b,那么a不受到b的欢迎。所以我们要找出度为0的点,找到后该点中点的个数就是答案。

注意:出度为0的点只能有一个,如果有多个出度为0的点,那么这些点都不受到彼此的欢迎。因此题目有解的情况就是只有一个出度为0的点。

(以上都是缩点后的分析)。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=10010;
 4 int head[N],nxt[N*20],to[N*20],dfn[N],low[N];
 5 int du[N],num[N],sum[N],st[N],top;
 6 int cnt,tot,idx,n,m;
 7 bool vis[N];
 8 void add(int u,int v){
 9     nxt[++tot]=head[u];
10     head[u]=tot;
11     to[tot]=v;
12 }
13 
14 void tarjan(int u){
15     dfn[u]=low[u]=++cnt;
16     st[++top]=u;
17     vis[u]=true;
18     for(int i=head[u];i;i=nxt[i]){
19         int v=to[i];
20         if(!dfn[v]){
21             tarjan(v);
22             low[u]=min(low[u],low[v]);
23         }
24         else if(vis[v]) low[u]=min(low[u],dfn[v]);
25     }
26     if(low[u]==dfn[u]){
27         int vv;
28         ++idx;
29         do{
30             vv=st[top--];
31             vis[vv]=false;
32             num[vv]=idx;
33             sum[idx]++;
34         }while(vv!=u);
35     }
36 }
37 
38 int main(){
39     scanf("%d%d",&n,&m);
40     while(m--){
41         int a,b;
42         scanf("%d%d",&a,&b);
43         add(a,b);
44     }
45     for(int i=1;i<=n;i++)
46         if(!dfn[i]) tarjan(i);
47     for(int i=1;i<=n;i++)
48         for(int j=head[i];j;j=nxt[j])
49             if(num[i]!=num[to[j]]) du[num[i]]++;
50     int x=0;
51     for(int i=1;i<=idx;i++)
52         if(!du[i]){
53             if(x) {puts("0");return 0;}
54             x=i;
55         }
56     printf("%d\n",sum[x]);
57     return 0;
58 }

 

标签:缩点,tarjan,洛谷,int,出度,++,dfn,low,vv
来源: https://www.cnblogs.com/yhxnoerror/p/16364700.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有