haoi2006_受欢迎的牛_Solution
Brief Solution:
强连通tarjan+压缩点+判断是否除了一个点,其它点都有出度
Detailed Solution:
把牛看成点
若一个点b能到达点a,则b认为a受欢迎
若所有的点都能到达点a,则a被所有的牛欢迎
对于某个强连通中的点,任意两点可互达,互相受欢迎
对图求强连通,并把强连通压缩成一个点
若点a向与点a不在同一个强连通集合的点b,则点a所在的集合指向点b所在的集合(边)
若一个强连通集合的点(新图的点A)能被所有的点到达,则新图所有的点能到达点A
此时新图没有环,若一个点A能被所有的点到达,则除了该点,其它点的出度都不为0(图必有没有出度的点,因为图没有环)
则能被所有的点到达的点只有一个,否则会有环,矛盾
(在没有环的条件下,图中所有的点到汇集(到达)该点)
Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
#define maxn 10000
#define maxm 50000 struct node
{
long d;
struct node *next;
}*info[maxn+];
long x[maxm+],y[maxm+];
long dfn[maxn+],low[maxn+],stack[maxn+],num[maxn+],ans[maxn+],count=,sum=;
bool vis[maxn+],vis_stack[maxn+],next[maxn+]; long min(long a,long b)
{
if (a>b)
return b;
else
return a;
} void tarjan(long d)
{
vis[d]=false;
count++;
stack[count]=d;
dfn[d]=count;
low[d]=count;
struct node *p;
long nd,pre;
p=info[d];
while (p)
{
nd=p->d;
if (vis[nd]==true)
{
tarjan(nd);
low[d]=min(low[d],low[nd]);
}
else if (vis_stack[nd]==true)
low[d]=min(low[d],dfn[nd]);
p=p->next;
}
pre=count;
if (dfn[d]==low[d])
{
sum++;
while (d!=stack[count])
{
num[stack[count]]=sum;
vis_stack[stack[count]]=false;
count--;
}
num[stack[count]]=sum;
vis_stack[stack[count]]=false;
count--;
ans[sum]=pre-count; //count+1~pre
}
} int main()
{
long i,n,m,d;
struct node *p;
scanf("%ld%ld",&n,&m);
// for (i=1;i<=n;i++)
// info[i]=NULL;
for (i=;i<=m;i++)
{
scanf("%ld%ld",&x[i],&y[i]);
p=(struct node *) malloc (sizeof(struct node));
p->d=y[i];
p->next=info[x[i]];
info[x[i]]=p;
}
for (i=;i<=n;i++)
{
vis[i]=true;
vis_stack[i]=true;
}
for (i=;i<=n;i++)
if (vis[i]==true)
tarjan(i);
for (i=;i<=sum;i++)
next[i]=false;
for (i=;i<=m;i++)
if (num[x[i]]!=num[y[i]])
next[num[x[i]]]=true;
d=;
for (i=;i<=sum;i++)
if (next[i]==false)
{
if (d==)
d=i;
else
{
d=-;
break;
}
}
if (d==-)
printf("0\n");
else
printf("%ld\n",ans[d]);
return ;
}
haoi2006_受欢迎的牛_Solution的更多相关文章
- bzoj1051 [HAOI2006]受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4773 Solved: 2541[Submit][Sta ...
- bzoj 1051 (强连通) 受欢迎的牛
题目:这里 题意: Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...
- 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数
[bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...
- 【BZOJ】1051: [HAOI2006]受欢迎的牛(tarjan)
http://www.lydsy.com/JudgeOnline/problem.php?id=1051 这题还好-1A了..但是前提还是看了题解的 囧.....一开始认为是并查集,oh,不行,,无法 ...
- BZOJ 1051 受欢迎的牛(Tarjan缩点)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4573 Solved: 2428 [Submit][S ...
- [bzoj1051] [HAOI2006]受欢迎的牛 (Tarjan+缩点)
强连通图,缩点 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受 ...
- 【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛
BZOJ难得的水题(其实是HA太弱了) 原题: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B ...
随机推荐
- vue 使用 proxyTable 解决跨域问题
1.在 main.js 中,在引入 axios: import axios from 'axios' Vue.config.productionTip = false Vue.prototype.$a ...
- 基于代的垃圾回收机制--《CLR via C#》读书笔记
我们知道,垃圾回收在内存无限大的理想情况下是不需要的,正是因为内存存在的瓶颈,我们才需要垃圾回收.在<垃圾回收算法之引用计数算法>和<垃圾回收算法之引用跟踪算法>两篇文章中,我 ...
- python 井字棋(Tic Tac Toe)
说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...
- JavaScript实现选项卡(三种方法)
本文实例讲述了js选项卡的实现方法. 一.html代码: <div id="div1"> <input class="active" type ...
- 【原】python3.7 无法pip安装提示ssl错误解决方案
问题 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not av ...
- 记录:Ubuntu 18.04 安装 tensorflow-gpu 版本
狠下心来重新装了系统,探索一下 gpu 版本的安装.比较令人可喜的是,跟着前辈们的经验,还是让我给安装成功了.由于我是新装的系统,就像婴儿般纯净,所以进入系统的第一步就是安装 cuda,只要这个不出错 ...
- (转载)利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 置顶
原文链接:https://blog.csdn.net/qq_25352981/article/details/46914837#commentsedit 本文目标是通过使用SIFT和RANSAC算法, ...
- 3Sum(or k_Sum)
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...
- 利用可道云kodexplorer在树莓派raspbian上搭建私有云网盘
可道云kodexplorer是一款开源私有云系统,类似于owncloud,Dropbox.SkyDrive,seafile等.将可道云kodexplorer搭建在树莓派上,从而在树莓派上存储.管理家庭 ...
- 华为云Istio服务网格,让应用治理智能化、可视化