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

题目意思是第一行先给出n和m表示有n件事,m个关系,接下来输入m行,每行有a,b两个数,他们之间的关系就是第a件事要在

第b件事之前做完,然后问你可不可以在符合这m个关系的情况下把这n件事情做完,可以就输出YES,否则输出NO。

现在先假设a b之间的关系用a指向b来表示,即a-->b。

题目里给的两个样例有点简单,来个稍微复杂一点的好吧。

第一次搞这个,不太会,见谅。看上面这个图,然后我们可以先得到这些数据:

6 7

1 5

1 3

2 5

3 4

3 5

3 6

5 6

入度:就理解为一个点被箭头指的次数(作为终点的次数),上图中 点1的入度为0,点5的入度为3,点3的入度为1。

出度:反一下,箭头出去的次数(作为起点的次数),点1的出度为2,点5的为1。(出度在这题用不到)

我们程序就是先找到入度为0(一开始有点1和点2)的点,然后把这个点标记为走过,再把以这个点为起点的边删掉,

我们先选点1,然后就下面酱紫了。

然后入度为0的点就有点2和点3了,随便选择一个,假设3好吧,然后:

一直这样下去

然后就没有然后了,把点4删了就完了。

以上是符合条件输出YES的情况,假设图是这样的

那么1和3就构成了一个环,入度为0的点只有2,然后删去2和以2位起点的边:


然后就没有入度为0的边了,然后程序结束,可是所有的点还没有走完(没有做完所有的事情),输出NO。

接下来就是怎么写的问题了。看代码吧

用vector的:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
vector<int>v[];
int n,m,k,t;
int num[],vis[];//num数组记录入度数目,vis数组看这个点是否访问过
void init()
{
for(int i=;i<=n;i++)
v[i].clear();
memset(num,,sizeof(num));
memset(vis,,sizeof(vis));
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(int i=;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
num[b]++; //点b入度 +1
v[a].push_back(b);//a-->b
}
int flag=;
for(int i=;i<=n;i++)//最多n次循环
{
for(int j=;j<=n;j++)//找1到n入度为0的点
{
if(vis[j])
continue;
if(num[j]==)
{
vis[j]=;//标记这个点走过
for(int k=;k<v[j].size();k++)
{
if(num[v[j][k]])
num[v[j][k]]--;//删边
}
}
}
}
for(int i=;i<=n;i++)
{
if(!vis[i])//看是不是所有事都做完了
flag=;
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return ;
}

再用队列和链式前向星优化一下:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,k,t;
struct node{
int v,next;
}str[];
int head[],vis[],in[],cnt;
queue<int>q;
void add(int u,int v)
{
str[++cnt].v=v;
str[cnt].next=head[u];
head[u]=cnt;
}
void init()
{
memset(vis,,sizeof(vis));
memset(head,-,sizeof(head));
memset(in,,sizeof(in));
cnt=;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(int i=;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
in[b]++;
}
while(!q.empty())
q.pop();
for(int i=;i<=n;i++)
{
if(!in[i])
q.push(i);
}
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int i=head[u];i!=-;i=str[i].next)
{
int v=str[i].v;
if(in[v])
in[v]--;
if(in[v]==&&!vis[v])
q.push(v);
}
}
int flag=;
for(int i=;i<=n;i++)
{
if(!vis[i])
{
flag=;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return ;
}

hdu 5154 拓扑排序的更多相关文章

  1. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  2. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  3. HDU 5638 拓扑排序+优先队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...

  4. hdu 2647 (拓扑排序 邻接表建图的模板) Reward

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...

  5. 传递 hdu 5961 拓扑排序有无环~

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分 ...

  6. hdu 4324 拓扑排序

    题意:给出一堆人的喜爱关系,判断有没有三角恋-_-|| 其实就是判断是否存在三条边的环. 一开始我是这么想的: 先拓扑排序,如果没有环那就直接No 如果有环?挑出环里的任意一个点(拓扑排序结束后不在拓 ...

  7. HDU 4324 (拓扑排序) Triangle LOVE

    因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. #include <c ...

  8. HDU 5438 拓扑排序+DFS

    Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  9. hdu 3342 拓扑排序 水

    好久没切题  先上水题! 拓扑排序! 代码: #include<iostream> #include<cstdio> #include<cstring> using ...

随机推荐

  1. centos使用记

    20180404:今天在笔记本上安装了centos6.9,第一次安装的7.4时进不了安装界面,后来下载了6.9版的,可以安装.安装完后启动时出现fail reg的错误,然后提示登陆,不知是用户名为:r ...

  2. 【ASP.NET 插件】分享一个可视化HTML编辑器 CKEditor.NET

    因为公司网站的可视化HTML编辑器IE兼容性问题,js报错不能使用,于是在网上找到了个还行的,图片本地上传的话直接把图片拖到编辑窗口就可以了.这个编辑器是在开源中国看到的,个人觉得还不错! CKEdi ...

  3. leetcode1023

    class Solution(object): def getGroup(self,que): group = list() temp = '' for i in range(len(que)): c ...

  4. 深度学习原理与框架-神经网络-cifar10分类(代码) 1.np.concatenate(进行数据串接) 2.np.hstack(将数据横着排列) 3.hasattr(判断.py文件的函数是否存在) 4.reshape(维度重构) 5.tanspose(维度位置变化) 6.pickle.load(f文件读入) 7.np.argmax(获得最大值索引) 8.np.maximum(阈值比较)

    横1. np.concatenate(list, axis=0) 将数据进行串接,这里主要是可以将列表进行x轴获得y轴的串接 参数说明:list表示需要串接的列表,axis=0,表示从上到下进行串接 ...

  5. cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'. One of '{"http://java.sun.com/xml/ns/javaee":init-param}' is expected.

    第一种方案:  将  "http://java.sun.com/xml/ns/javaee"  换为  "http://java.sun.com/xml/ns/j2ee& ...

  6. where后一个条件和多个条件的查询速度

    如果记录中有两个都是 唯一标识的  ,那是都where  and 还是只写一个比较快 ---- 一个快

  7. 关于C# WinForm中进度条的实现方法

    http://www.cnblogs.com/Sue_/articles/2024932.html 进度条是一个软件人性化考虑之一,他给用户的感觉就是程序内部在不停的动作,执行到了什么程度,而不是整个 ...

  8. postmessage/cors跨域postMessage、xhr2和xmldomain

    一.h5 postMessage node http-server配置服务器 有关配置:请参考我的http://www.cnblogs.com/leee/p/5502727.html 我把文件夹a配置 ...

  9. 一个关于EasyUI超恶心的BUG。。。Cannot read property 'options' of undefined

    控制台Console抛出的异常: jquery.easyui.min.js:9148 Uncaught TypeError: Cannot read property 'options' of und ...

  10. week5 03 continus loading news

    1.server-side : Rest API 2. client-side 想要持续不断的下拉获取新闻 有两种做法 一种是在UI 我们调用API 获取所有的新闻 然后在UI 拉下的时候显示新闻 其 ...