hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个
- #include<stdio.h>
- #include<string.h>
- #define N 21000
- struct node {
- int v,next;
- }bian[51000];
- int yong,dfn[N],low[N],stac[N],top,index,visit[N],ans,flag,mark[N],head[N],pre[N];
- void init() {//初始化
- memset(dfn,0,sizeof(dfn));
- memset(low,0,sizeof(low));
- memset(mark,0,sizeof(mark));
- memset(visit,0,sizeof(visit));
- memset(head,-1,sizeof(head));
- memset(pre,0,sizeof(pre));
- flag=0;yong=0;
- index=0;top=0;ans=0;
- memset(stac,0,sizeof(stac));
- }
- void addedge(int u,int v) {
- bian[yong].v=v;
- bian[yong].next=head[u];
- head[u]=yong++;
- }
- int MIN(int a,int b) {
- return a>b?b:a;
- }
- void judge(int v,int u) {//对于每一个强连通分量对边的两边的点增一
- while(pre[u]!=v) {
- mark[u]++;
- if(mark[u]>1) {
- flag=1;return ;
- }
- u=pre[u];
- }
- return ;
- }
- void tarjan(int u) {
- dfn[u]=low[u]=++index;
- stac[++top]=u;
- visit[u]=1;
- int i;
- for(i=head[u];i!=-1;i=bian[i].next) {
- int v=bian[i].v;
- if(dfn[v]==0) {
- pre[v]=u;
- tarjan(v);
- if(flag)
- return ;
- low[u]=MIN(low[u],low[v]);
- }
- else if(visit[v]) {
- judge(v,u);
- if(flag)return ;
- low[u]=MIN(low[u],dfn[v]);
- }
- }
- if(dfn[u]==low[u]) {
- ans++;
- if(ans>1){//判断是否是一个强联通图
- flag=1;return ;
- }
- int t;
- do{
- t=stac[top--];
- visit[t]=0;
- }while(t!=u);
- }
- return ;
- }
- int main() {
- int t,n,a,b,i;
- scanf("%d",&t);
- while(t--) {
- init();
- scanf("%d",&n);
- while(scanf("%d%d",&a,&b),a||b) {
- addedge(a,b);
- }
- for(i=0;i<n;i++) {
- if(!dfn[i])
- tarjan(i);
- if(flag)break;
- }
- if(flag==0)
- printf("YES\n");
- else
- printf("NO\n");
- }
- return 0;
- }
hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个的更多相关文章
- hdu 3594 Cactus /uva 10510 仙人掌图判定
仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...
- HDU 3594 Cactus 有向仙人掌图判定
题意 给出一个有向图,并给出仙人掌图的定义 图本身是强连通的 每条边属于且只属于一个环 判断输入的图是否是强连通的. 分析 杭电OJ上的数据比较弱,网上一些有明显错误的代码也能AC. 本着求真务实的精 ...
- HDU 3594 Cactus (强连通+仙人掌图)
<题目链接> <转载于 >>> > 题目大意: 给你一个图,让你判断他是不是仙人掌图. 仙人掌图的条件是: 1.是强连通图. 2.每条边在仙人掌图中只属于一个 ...
- HDU 3594.Cactus 仙人掌图
Cactus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu3594 强连通(仙人掌图)
题意:给定一张有向图,问是否是仙人掌图.仙人掌图的定义是,首先,这张图是一个强连通分量,其次所有边在且仅在一个环内. 首先,tarjan可以判强连通分量是否只有一个.然后对于所有边是否仅在一个环内,我 ...
- HDU 6041.I Curse Myself 无向仙人掌图
I Curse Myself Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- HDU 6041 I Curse Myself ——(仙人掌图,tarjan,转化)
题解见这个博客:http://blog.csdn.net/ME495/article/details/76165039. 复杂度不太会算..这个经典问题的解法需要注意,维护队列里面只有k个元素即可.另 ...
- bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图
http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...
- 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
随机推荐
- C++重载运算符简单总结
当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义.明智的使用运算符重载能令我们的程序更易于编写和阅读. 一.基本概念 什么是运算符重载?重载的运算符是具有特殊名字的函数:它们 ...
- Android EditText技巧总结
一.默认不获取焦点: 在布局文件的父控件中,设置如下属性: android:focusable="true" android:focusableInTouchMode=" ...
- hihocoder 1676 树上等差数列 黑科技树形dp
#1676 : 树上的等差数列 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵包含N个节点的无根树,节点编号1~N.其中每个节点都具有一个权值,第i个节点的权值 ...
- B3109 [cqoi2013]新数独 搜索dfs
就是基于普通数独上的一点变形,然后就没什么了,普通数独就是进行一边dfs就行了. 题干: 题目描述 输入格式 输入一共15行,包含一个新数独的实例.第奇数行包含左右方向的符号(<和>),第 ...
- 复习--二叉树&&树
树是一种很常用的数据结构,日后的学习中会经常碰到运用树的知识. //构造二叉树#include<cstdio> #include<iostream> #include<a ...
- java 分布式锁
转自:http://www.hollischuang.com/archives/1716 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CA ...
- Shuffle'm Up(串)
http://poj.org/problem?id=3087 题意:每组3个串,前两个串长度为n,第三个串长度为2*n,依次从第二个串(s2)中取一个字符,从第一个串(s1)中取一个字符,...... ...
- JS中对象按属性排序(冒泡排序)
在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据json中某一项进行数组的排序. 例如返回的数据结构大概是这样: { result:[ {id:,name:'中国银 ...
- Java多线程-synchronized关键字
进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...
- Android学习——数据存储之文件存储
将数据存储到文件中并读取数据 1.新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下 ...