拓扑排序O(E), bellman O(VE)   , 使用邻接表的dfs O(V+E) ,floyd O(N*N*N)

bellman算法只能判断是否存在负环。

所以可以先把权值全部设为-1

 #include <stdio.h>
#include <string.h>
#include <vector>
#include <stack>
using namespace std;
const int N = + ;
const int INF = <<;
struct node
{
int u,v,weight;
}g[N+N];
int dist[N];
inline int max(const int &a, const int &b)
{
return a < b ? b : a;
} void init(int n)
{
for(int i=; i<=n; ++i)
{ dist[i] = INF;
}
} void relax(int u, int v, int weight)
{
if(dist[v] > dist[u] + weight)
dist[v] = dist[u] + weight;
}
bool bell(int n, int m)
{
int i,j;
for(i=; i<n; ++i)
for(j=; j<m; ++j)
relax(g[j].u,g[j].v,g[j].weight); for(i=; i<m; ++i)
if(dist[g[i].v] > dist[g[i].u] +g[i].weight)
return true;
return false;
}
int main()
{
int n,m,i,u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n== && m==)
break;
init(n);
for(i=; i<m; ++i)
{
scanf("%d%d",&g[i].u,&g[i].v);
g[i].weight = -;//把权值全部改为负的,然后判断是不是存在负环
if(g[i].u==)
dist[g[i].v] = -;
}
if(bell(n,m))
puts("NO");
else
puts("YES");
}
}

枚举起点进行dfs,如果能遇到顶点和起点相同,则存在环

 #include <stdio.h>
#include <string.h>
#include <vector>
#include <stack>
using namespace std;
const int N = + ;
vector<int> g[N];
int start;
bool vis[N],flag;
void dfs(int u)
{
if(flag)
return;
for(int i=;i<g[u].size(); ++i)
{
int v = g[u][i];
if(v==start)
{
flag = true;//有环
return;
}
if(!vis[v])
{
vis[v] = true;
dfs(v);
}
}
}
int main()
{
int n,m,i,u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n== && m==)
break;
for(i=; i<n; ++i)
g[i].clear();
for(i=; i<m; ++i)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
}
flag = false;
for(i=; i<n; ++i)
{
memset(vis,,sizeof(vis));
vis[i] = true;
start = i;
dfs(i);
if(flag)
break;
}
if(flag)
puts("NO");
else
puts("YES");
}
}

拓扑排序如果能生成n个顶点序列,那么说明是GAG图

 #include <stdio.h>
#include <string.h>
#include <vector>
#include <stack>
using namespace std;
const int N = + ;
vector<int> g[N];
stack<int> st;
int in[N],add[N],cnt;
inline int max(const int &a, const int &b)
{
return a < b ? b : a;
}
void topSort(int n, int m)
{
int u,i;
for(i=; i<=n; ++i)
if(in[i]==)
st.push(i);
while(!st.empty())
{
u = st.top();
cnt++;
st.pop();
for(i=; i<g[u].size(); ++i)
{
--in[g[u][i]];
if(in[g[u][i]]==)
st.push(g[u][i]); }
}
}
void init(int n)
{
cnt = ;
for(int i=; i<=n; ++i)
{
g[i].clear();
add[i] = in[i] = ;
}
}
int main()
{
int n,m,i,u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n== && m==)
break;
init(n);
for(i=; i<m; ++i)
{
scanf("%d%d",&u,&v);
u++;
v++;
g[u].push_back(v);
in[v]++;
}
topSort(n,m);
if(cnt==n)//能生成n个顶点的序列,说明是DAG图
{
puts("YES");
}
else
puts("NO");
}
}

判断DAG图的更多相关文章

  1. 图论--拓扑排序--判断是否为DAG图

    #include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...

  2. POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)

    (点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...

  3. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

    sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个有向图 ...

  4. 有标号的DAG图计数1~4

    前言 我什么都不会,菜的被关了起来. 有标号的DAG图I Solution 考虑递推,设\(f_i\)表示i个点的答案,显然这个东西是可以组合数+容斥递推? 设\(f_i\)表示i个点的答案,我们考虑 ...

  5. SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...

  6. Tarjan缩点+DAG图dp

    题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...

  7. 《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析

    <编译原理>画 DAG 图与求优化后的 4 元式代码- 例题解析 DAG 图(Directed Acylic Graph)无环路有向图 (一)基本块 基本块是指程序中一顺序执行的语句序列, ...

  8. 洛谷 P2656 (缩点 + DAG图上DP)

    ### 洛谷 P2656 题目链接 ### 题目大意: 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖 ...

  9. SDUT-2140_判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个有向图,判 ...

随机推荐

  1. 一场刺激的游戏——很文艺的山东省第四届ACM赛总结(菜鸟版)

               人生就像一个个节点,节点中或许有成功,失败,满足,遗憾,但是只要它是不可复制的,在日后,便是美好.                                         ...

  2. Swift - 页控件(UIPageControl)的用法

    使用页控件可以用来展示多个桌面.比如很多应用第一次登陆时,会在开始页面使用页控件来介绍功能,通过左右滑动来切换页. 通常我们使用UIPageControl和UIScrollView相互结合来实现多页切 ...

  3. HTTP POST请求的Apache Rewrite规则设置

    最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据.http post请求的url格式为:     ...

  4. Java DatagramSocket(UDP)要注意的问题

    因为byte数组的大小问题,在网络发送过程中.可能包括多余的空格,若接收时要对数据进行比較,最好先将数据做下处理,处理掉多余的空格.

  5. RealThinClient学习(一)

    服务端代码: unit RtcHttpServer; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  6. Storm集群中执行的各种组件及其并行

    一.Storm中执行的组件      我们知道,Storm的强大之处就是能够非常easy地在集群中横向拓展它的计算能力,它会把整个运算过程切割成多个独立的tasks在集群中进行并行计算.在Storm中 ...

  7. 千万别用模板给的list.size()巨坑

    要用!list.empty()取代i<list.size();否则就不会AC了.

  8. JMS学习(三)ActiveMQ Message Persistence(转)

    1,JMS规范支持两种类型的消息传递:persistent and non-persistent.ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复.中间状态的消息(message are ...

  9. [Android面试题-7] 写出一个Java的Singleton类(即单例类)

    1.首先明确单例的概念和特点: a>单例类只能有一个实例 b>单例类必须自己创建一个自己的唯一实例 c>单例类必须为其他所有对象提供这个实例 2.单例具有几种模式,最简单的两种分别是 ...

  10. 三框架:使用数据源dbcp注意

    使用spring整合hibernate时间,需要使用该数据源,数据源使用apache的dbcp,使用dbcp当需要依靠pool的jar包.选择dbcp和pool当你需要注意. DBCP 2 compi ...