HDU3342 Legal or Not

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342

题目意思:一群大牛互相问问题,大牛有不会的,会被更厉害的大牛解答,更厉害的大牛是会的东西比大牛多,但是有的时候更厉害的大牛会装弱,出来问问题,这样就被大牛解答了。这样就形成了一个圈。题目的意思就是让你在一个有向图里面判断是否存在环。我们可以通过dfs和拓扑排序两种方法。

DFS的代码:

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=+;
using namespace std;
typedef long long L;
vector<int>q;
vector<int>p[N];
int in[N];
int main(){
ios::sync_with_stdio(false);cin.tie();
int n,m;
while(cin>>n>>m){
q.clear();
memset(in,,sizeof(in));
for(int i=;i<=n;i++) p[i].clear();
q.clear();
int reward[N];
for(int i=;i<=n;i++) reward[i]=;
for(int i=;i<m;i++){
int a,b;
cin>>a>>b;
p[b].push_back(a);
in[a]++;
}
int ct=,ans=;
for(int i=;i<=n;i++) if(!in[i]) {q.push_back(i);ans+=reward[i];}
while(q.size()!=){
int t=q.back();q.pop_back();
ct++;
for(int i=;i<p[t].size();i++){
int x=p[t][i];
if(--in[x]==){
q.push_back(x);
reward[x]=max(reward[x],reward[t]+);
ans+=reward[x];
}
else{
reward[x]=max(reward[x],reward[t]+);
}
}
}
if(ct!=n){
cout<<-<<endl;
}
else cout<<ans<<endl;
}
return ;
}

dfs的思路,就是一路遍历做标记,然后如果遍历到已经遍历过的就说明存在环,但是一找到环就可以break,跳出,结束dfs,可以剪枝,不然会超时,因为一个点可能遍历很多遍,所以dfs是比较慢的。

拓扑排序的做法

为什么可以判圈我在我的另外一篇博文里面已经说清楚了:http://www.cnblogs.com/xiaowuga/p/7218382.html

还是把一个环缩成一个点思想,环上的大小关系的等价的,从而无法遍历所有的点,通过遍历点的数量来判断是否形成环。

代码:

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=+;
using namespace std;
typedef long long L;
vector<int>q;
vector<int>p[N];
int in[N];
int main(){
ios::sync_with_stdio(false);cin.tie();
int n,m;
while(cin>>n>>m&&n&&m){
q.clear();
memset(in,,sizeof(in));
for(int i=;i<n;i++) p[i].clear();
q.clear();
for(int i=;i<m;i++){
int a,b;
cin>>a>>b;
p[b].push_back(a);
in[a]++;
}
int ct=;
for(int i=;i<n;i++) if(!in[i]) {q.push_back(i);}
while(q.size()!=){
int t=q.back();q.pop_back();
ct++;
for(int i=;i<p[t].size();i++){
int x=p[t][i];
if(--in[x]==){
q.push_back(x);
}
}
}
if(ct!=n){
cout<<"NO"<<endl;
}
else cout<<"YES"<<endl;
}
return ;
}

HDU3342有向图判圈DFS&&拓扑排序法的更多相关文章

  1. poj 1270(dfs+拓扑排序)

    题目链接:http://poj.org/problem?id=1270 思路:就是一简单的dfs+拓扑排序,然后就是按字典序输出所有的情况. http://paste.ubuntu.com/59872 ...

  2. 百度之星热身赛-1001(dfs拓扑排序)

    题意:作为年度优秀魔法学员的奖赏,哈利得到了一台具有魔力的计算机.这台计算机一旦开始处理某个任务,就会一直处理到这个任务结束为止(所以你可以认为它是单线程的).有一天,这台计算机得到了n个任务要处理, ...

  3. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

  4. COJ 3012 LZJ的问题 (有向图判环)

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1042 试题描述: LZJ有一个问题想问问大家.他在写函数时有时候很头疼,如 ...

  5. C++编程练习(12)----“有向图的拓扑排序“

    设G={V,E}是一个具有 n 个顶点的有向图,V中的顶点序列 v1,v2,......,vn,满足若从顶点 vi 到 vj 有一条路径,则在顶点序列中顶点 vi 必在顶点 vj 之前.则称这样的顶点 ...

  6. 有向图的拓扑排序的理解和简单实现(Java)

    如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...

  7. HDU-5222 Exploration(拓扑排序)

    一.题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5222 二.题意 给一个无向边+有向边的混合图,其中每条边只能使用一次,问图中是否存在环. 三.思路 ...

  8. HUD2647 Reward_反向建图拓扑排序

    HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...

  9. [LOJ2114][HNOI2015]-菜肴制作-拓扑排序+贪心

    <题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!&qu ...

随机推荐

  1. ios端 返回上一级后 卡在正在加载中处理方式

    //返回上一页 $('#goback').click(function () { history.back(); }); //判断是否为ios系统,若为ios则监听并重载 var u = naviga ...

  2. CBiontCache

    /************************************************************************/ /* 预先加载一些生物以备将来使用 */ /* 专 ...

  3. SQL业务审核与优化

    审核   什么是业务审核 类似与code review 评审业务Schema和SQL设计 偏重关注性能 是业务优化的主要入口之一           审核提前发现问题,进行优化           上 ...

  4. 内存对齐与ANSI C中struct型数据的内存布局

    当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不 ...

  5. 记录一个glibc 导致的段错误以及gdb 移植

    上一篇我有相关关于一个段错误的记录,现在记录当时的段错误具体是在哪里的. // 从 GNU 的官网下载当前在使用的 glibc 的源代码以及最新的 glibc 源代码 // 地址如下: http:// ...

  6. HTML5标准最终来了,看什么书学习最好??????

    近期看了一本书<HTML5网页开发实例具体解释>,是大众点评的攻城狮写的,认为非常有收获.看样子眼下大多数的国内网页都支持HTML5了,全栈project师是不是必须得会HTML5? 有兴 ...

  7. EasyUI Pagination 分页分页布局定义 显示按钮布局

    //分页布局定义.该属性自版本 1.3.5 起可用.//布局项目包括一个或多个下列值://1.list:页面尺寸列表.//2.sep:页面按钮分割.//3.first:第一个按钮.//4.prev:前 ...

  8. Android Studio 工具栏添加图标

    本文中 Android Studio 的版本为 Android Studio 2.2 ,操作系统为 Windows,如有操作不同,可能是版本差异.在工具栏中添加一些常用的图标有利于我们开发,举例说明: ...

  9. 【BZOJ】1609: [Usaco2008 Feb]Eating Together麻烦的聚餐(dp+被坑)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1609 首先我不得不说,我被这题坑了.题目前边没有说可以不需要3种牛都有啊!!!!!!!!然后我一直在 ...

  10. HTML5+Canvas+jQuery调用手机拍照功能实现图片上传(二)

    上一篇仅仅讲到前台操作,这篇专门涉及到Java后台处理.前台通过Ajax提交将Base64编码过的图片数据信息传到Java后台,然后Java这边进行接收处理.通过对图片数据信息进行Base64解码,之 ...