今天讲了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);
}

最新文章

  1. Hbuilder开发HTML5 APP之WebView
  2. angularjs UI Libraries
  3. 七个结构模式之装饰者模式(Decorator Pattern)
  4. 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]
  5. 【POJ 1789】Truck History(最小生成树)
  6. uC/OS II原理分析及源码阅读(一)
  7. APP顶号逻辑
  8. java版大数相乘
  9. HDU 2222 AC自动机 裸题
  10. 关appid
  11. NET平台机器学习组件-Infer.NET
  12. 研发团队如何写好API接口文档
  13. RESTClient 使用
  14. AngularJs中url参数的获取
  15. 【代码审计】QYKCMS_v4.3.2 任意文件上传漏洞分析
  16. hibernate中cascade和inverse
  17. jQuery.extend()意义及用途
  18. zen cart 空白页面的解决方案
  19. Perl 学习笔记-哈希
  20. javascript总结36:DOM-点击按钮切换图片案例

热门文章

  1. Excel中最精确的计算年龄的公式
  2. 盒模型的垂直居中css
  3. postgresql某个字段值按照指定规则排序
  4. cocos2d windows游戏平台搭建
  5. Matrix-tree 定理的一些整理
  6. 微信小程序 TLS 版本必须大于等于1.2问题解决
  7. Springboot自定义异常处理
  8. ccf 201903-5 317任务
  9. java aes CBC的填充方式发现
  10. Apache Spark 章节1