topological sort~~~~初学
今天讲了topological sort
问题:
判环:记录入队的点数,若<n则有环,可证;
算法:o(n):queue or stack,而不是o(n^2)枚举
#. 关系运算图(vijos1094)
描述
提交
自定义测试
题目描述
给出一有向图,图中每条边都被标上了关系运算符‘<’,‘>’,‘=’。现在要给图中每个顶点标上一个大
于等于0小于等于k的某个整数使所有边上的符号得到满足。若存在这样的k,则求最小的k,
若任何k都无法满足则输出NO。 例如下表中最小的k为2。
结点1>结点2
结点2>结点3
结点2>结点4
结点3=结点4
如果存在这样的k,输出最小的k值;否则输出‘NO’。
输入格式
共二行,第一行有二个空格隔开的整数n和m。n表示图的结点个数,m表示图的边数,
其中1<=n<=, <=m<=。全部结点用1到n标出,图中任何二点之间最多只有一条边,
且不存在自环。 第二行共有3m个用空格隔开的整数,第3i-2和第3i-(<=i<=m)
个数表示第i条边的顶点。第3i个数表示第i条边上的符号,其值用集合{-,,}中的数表示:
-1表示‘<’, 表示‘=’, 1表示‘>’
输出格式
仅一行,如无解则输出‘NO’;否则输出最小的k的值。
输入样例
- - -
输出样例
限制与约定
时间限制:1s
空间限制:128MB
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=1e3+;
const int maxm=1e4+;
inline int read()
{
int a=;bool b=;char x=getchar();
while(x<''||''<x){
if(x='-')b=;
x=getchar();
}
while(''<=x&&x<=''){
a=(a<<)+(a<<)+x-'';
x=getchar();
}
return b ? a : -a ;
}
int f[maxn];
inline int find(int x){
if(f[x]==x)return x;
else return f[x]=find(f[x]);
}
int first[maxn],next[maxm],to[maxm],edge_count;
inline void add(int x,int y){
edge_count++;
to[edge_count]=y;
next[edge_count]=first[x];
first[x]=edge_count;
}
int Ans,ans[maxn],n,m,cnt,indegree[maxn],queue[maxn];
inline void topological_sort()
{
int rear=,front=;
for(int i=;i<=n;i++){
if(find(i)==i && !indegree[i]){
queue[front++]=i;
}
}
while(rear<front){
int pos=queue[rear];
for(int i=first[pos];i;i=next[i]){
int v=to[i];
indegree[v]--;
if(!indegree[v]){
queue[front++]=v;
ans[v]=ans[pos]+;
Ans=max(Ans,ans[v]);
}
}
rear++;
}
if(front<cnt){
printf("NO\n");
exit();
}
}
int u[maxm],v[maxm],b[maxm];
int main()
{
cnt=n=read();m=read();
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=m;i++){ u[i]=read();v[i]=read();b[i]=read(); if(!b[i]){
int ru=find(u[i]);int rv=find(v[i]);
f[ru]=rv;
cnt--;
}
}
for(int i=;i<=m;i++){
int ru=find(u[i]);int rv=find(v[i]);
if(b[i]==){//以 小<于 为边
add(rv,ru);
indegree[ru]++;
}
else if(b[i]==-){
add(ru,rv);
indegree[rv]++;
}
}
topological_sort(); printf("%d",Ans);
}
topological sort~~~~初学的更多相关文章
- 【拓扑排序】【线段树】Gym - 101102K - Topological Sort
Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...
- topological sort
A topological sortof a dag G is a linear ordering of all its vertices such that if G contains anedg ...
- 拓扑排序(Topological Sort)
Graph 拓扑排序(Topological Sort) 假设一个应用场景:你用 C 编写了一个爬虫工具,其中有很多自定义的库:queue.c.queue.h.stack.c.stack.h.heap ...
- Some facts about topological sort
Definition: a topological sort of a DAG G is a sort such that for all edge (i,j) in G, i precedes j. ...
- 6-16 Topological Sort(25 分)
Write a program to find the topological order in a digraph. Format of functions: bool TopSort( LGrap ...
- [Algorithms] Topological Sort
Topological sort is an important application of DFS in directed acyclic graphs (DAG). For each edge ...
- [MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序
一.深度优先搜索 它的定义是:递归探索图,必要时要回溯,同时避免重复. 关于深度优先搜索的伪代码如下: 左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点 ...
- Leetcode: Alien Dictionary && Summary: Topological Sort
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- 拓扑排序 Topological Sort
2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...
随机推荐
- 差分约束 HDU - 1384 HDU - 3592 HDU - 1531 HDU - 3666
Intervals Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- spring Boot 入门--为什么用spring boot
为什么用spring boot 回答这个问题不得不说下spring 假设你受命用Spring开发一个简单的Hello World Web应用程序.你该做什么? 我能想到一些 基本的需要. 一个项目 ...
- 04--STL序列容器(Stack和Queue)
总括: stack和queue不支持迭代 一:栈Stack (一)栈的简介 stack是堆栈容器,是一种“先进后出”的容器. stack是简单地装饰deque容器而成为另外的一种容器. (二)栈的默认 ...
- [源码分析]读写锁ReentrantReadWriteLock
一.简介 读写锁. 读锁之间是共享的. 写锁是独占的. 首先声明一点: 我在分析源码的时候, 把jdk源码复制出来进行中文的注释, 有时还进行编译调试什么的, 为了避免和jdk原生的类混淆, 我在类前 ...
- windows 7 命令修改IP地址
netsh interface ip set address "本地连接" static 172.17.15.97 255.255.255.0 172.17.12.1
- request redirection
# encoding:utf-8 import reimport jsonimport randomfrom esdapi.config import BASE_URLfrom requests.se ...
- CRMEB 商城系统常见错误修复办法
清空了用户表,没有清空拼团记录表导致,解决办法 --v2.5.2 清空拼团表-- TRUNCATE table eb_store_pink 修改了组合数据规则导致的,更新数据即可 --v2.5.2 e ...
- javascript 事件冒泡和事件代理
事件冒泡 简单的讲,当子元素的事件处理函数被触发(如onclick),该事件会从事件源(当前子元素)逐级向上层元素传递,触发祖先元素的 onclik 事件,一直到最外层 html 根元素. 这可能会带 ...
- 【2】学习C++之引用
C++中的引用类似于现实生活中人们之间起昵称,昵称和本名都可以辨别人. 1.普通变量的引用: ;//a为本名 int &b=a;//b为a的昵称 其中不能光有昵称没有本名,如果只定义了引用,却 ...
- 【汇编语言】Win10 安装 DOXBox0.74
1.下载package包,有用的只有前两个. 2.解压 masm 压缩文件,我把它解压到D盘. 3.双击 图1 中的 DOXBox 0.74.exe 进行安装. 4.打开 DOXBox0.74 (参考 ...