hoj 3005 Game Rigging 强联通分量求缩点
/*
题目:
现给出各位选手的能力比较并给出自己的朋友的参赛号码,如何组织比赛使得自己的朋友能够获胜
分析:
各选手能力比较可以构造一个有向图,而想要使得自己的朋友要赢得比赛,所以他的所在的连通块
必定是入度为0的(假设建图时是以能力大的人作为边的起点)。所以题目可以转换为先建图,然后
再找连通块求缩点,然后判断该缩点是否入度为0,若有朋友在该连通块中,即可判断可以组织这样
的一场比赛。而判断朋友在不在该连通块中,可以先求到所有的入度为0的连通块用数组置为true,
然后直接把所有朋友的所在的连通块置为false,若所有的连通块中只要还有true的连通块,就可判断
不能组织这样的一场比赛
*/
#include <cstdio>
#include <cstring>
const int X = 100005;
int dfn[X],low[X],stack[X],deg[X],father[X],depth,top,bcnt;
int f[X],fri,n,m;
bool use[X],instack[X];
struct node
{
int v;
node *next;
void fun()
{
v = 0;
next = NULL;
}
}edge[X],*head[X],*tmp;
void tarjan(int u)
{
int v;
dfn[u] = low[u] = ++depth;
stack[++top] = u;
instack[u] = true;
for(node *p=head[u];p;p=p->next)
{
v = p->v;
if(!low[v])
{
tarjan(v);
if(low[v]<low[u])
low[u] = low[v];
}
else if(instack[v]&&low[u]>dfn[v])
low[u] = dfn[v];
}
if(low[u]==dfn[u])
{
bcnt++;
do
{
v = stack[top--];
instack[v] = false;
father[v] = bcnt;
}while(u!=v);
}
}
void solve()
{
memset(instack,false,sizeof(instack));
memset(low,0,sizeof(low));
memset(deg,0,sizeof(deg));
depth = bcnt = top = 0;
for(int i=1;i<=n;i++)
if(!low[i])
tarjan(i);
for(int i=1;i<=n;i++)
for(node *p=head[i];p;p=p->next)
if(father[i]!=father[p->v])
deg[father[p->v]]++;
memset(use,false,sizeof(use));
for(int i=1;i<=bcnt;i++)
if(!deg[i])
use[i] = true;
for(int i=0;i<fri;i++)
use[father[f[i]]] = false;
bool flag = true;
for(int i=1;i<=bcnt;i++)
if(use[i])
{
flag = false;
break;
}
flag?printf("yes\n"):printf("no\n");
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
while(scanf("%d%d%d",&n,&fri,&m),n||m||fri)
{
for(int i=0;i<fri;i++)
scanf("%d",&f[i]);
memset(head,NULL,sizeof(head));
for(int i=0;i<m;i++)
edge[i].fun();
tmp = edge;
int u,v;
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
tmp->next = head[u];
tmp->v = v;
head[u] = tmp++;
}
solve();
}
return 0;
}
转载于:https://www.cnblogs.com/yejinru/archive/2012/05/18/2507973.html
hoj 3005 Game Rigging 强联通分量求缩点相关推荐
- [HDOJ6165] FFF at Valentine(强联通分量,缩点,拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165 题意:问一个有向图中是否有任意两点可以到达. 读错题就彻底输了,读成判断是否有任意条路,使得经过 ...
- HDU6072(Kosaraju求强联通分量+位运算)
题意:给你n个点,和一个n*n的01矩阵表示边,有m次询问,问更改k条边后的强连通分量. 题解:对于每个询问,求出强连通分量,那么一个点数为t的强连通分量对答案的贡献为 t(t−1)2 \frac{t ...
- BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2140 是 hydro 的 BZOJ ...
- P3387-【模板】缩点【tarjan,强联通分量,DAGdp】
正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&pid=P3387 大意 一个有向图.每个点有权值,但每个值只能取一次,每条边 ...
- Tarjan的强联通分量
求强联通分量有很多种. <C++信息学奥赛一本通> 中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...
- 关于强联通分量 的求法讨论
这个讨论主要是关于 HA2006年最受欢迎的牛 的讨论 . 尽管这道题对于很多dalao来说都觉得是模板题,但是仍是值得思考的,因为我第一次写这道题的时候, 缩完点之后建图建错玄学跑dfs n^2做法 ...
- [vios1023]维多利亚的舞会3强联通分量tarjan
题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹 ...
- [图论]强联通分量+缩点 Summer Holiday
Summer Holiday Description 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系 ...
- CodeForces 1213F (强联通分量分解+拓扑排序)
传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...
最新文章
- java url路径包含中文_谈谈 Java 类加载机制
- include_once 问题
- 再谈javascript图片预加载经典技术
- AngularJS内置指令
- sharepoint 2013 自定义列表eventhandle权限控制
- 单片机模块学习之LED
- POJ - 1741 Tree(点分治模板题)
- 【python】数据结构和算法 + 浅谈单链表与双链表的区别
- 重庆大学c语言程序设计基础,c语言程序设计基础黄文胜
- HustOJ 基础搭建教程
- 死锁、CPU飙高、内存泄漏、内存溢出、栈溢出 问题定位及解决方法汇总
- R 中 facet_wrap() 和 facet_grid() 的区别
- python制作电脑软件_python制作一个桌面便签软件 -电脑资料
- c语言窗口插入图片,c语言添加图片Word版
- 英文状态下输入字母,字母之间的间隔较大怎么解决?
- 京东到家话费券系统NIO实战
- 别再跟面试官说你不懂什么是 IP 协议了
- 设计模式 —— Builder 模式
- 如何查看Win11可以升级22h2?Win11升级22h2的方法
- 产品运营数据分析框架应该包含哪些重要指标?
热门文章
- d029: 求出2-100之间的所有质数(素数)
- C# 读取ini文件 百度问问学习文档
- poj 1016 Numbers That Count【字符串】
- asp.net 获取 当前日期时间 及 前后N天日期时间(DropDownList数据绑定)
- plsql连接oracle报错12514,plsql 登录 oracle11 12514 错误的处理方法
- 用c语言写扫雷游戏倒计时代码,课内资源 - 基于VS2013实现的扫雷小游戏
- mysql配置及其使用
- 《剑指Offer》题一~题十
- 湖南省第6届程序大赛第3题 数字整除
- 模拟器中文输入法设置