题目链接 https://vjudge.net/problem/HihoCoder-1689

有N个整数A1, A2, ... AN,现在我们知道M条关于这N个整数的信息。每条信息是:

Ai < Aj 或者 Ai = Aj

小Hi希望你能从第一条信息开始依次逐条处理这些信息。一旦能推断出A1和AN的大小关系就立即停止。

输出在处理第几条时第一次推断出A1和AN的关系。如果处理完全部M条信息还是不知道A1和AN的大小关系,输出-1。

保证M条信息是没有矛盾的。

Input

第一行包含两个整数N和M。

以下M行每行包含一条信息Ai < Aj 或者 Ai = Aj

对于30%的数据,1 ≤ N ≤ 1000, 1 ≤ M ≤ 10000

对于100%的数据,1 ≤ N ≤ 100000, 1 ≤ N ≤ 1000000

Output

一个整数表示答案。

Sample Input

5 8
A1 < A3
A3 < A2
A3 < A4
A5 < A2
A1 < A4
A1 < A2
A5 < A1
A5 < A3

Sample Output

7

【思路】

图论基础+二分法 如果a<b就加一条有向边a->b如果a==b就加两条有向边a->b和b->a,然后用一个变量index记录这条边是输入中从上往下数的第几条边,采用二分法判断前x条边内否判断出最终的大小关系,在二分的时候要用两次dfs,一次是看能否从起点走到终点,另一次是从终点到起点,只要有一次连通着就可以,dfs搜索的时候所经过的边不能超过mid,最后就能出答案了。输入格式比较坑,我也是看另一个人的题解才知道的。

#include<bits/stdc++.h>
using namespace std;const int maxn = 1e5 + 50;
const int maxm = 1e6 + 50;int n, m, from, to;
int le, ri, mid;
char op[2];struct node {int to, index;node(int t, int in) :to(t), index(in) {}
};bool used[maxn];
vector<node> g[maxn];void init() {for (int i = 0; i < maxn; ++i) g[i].clear();
}bool dfs1(int u) {if (u == 1) return 1;used[u] = 1;for (int i = 0; i < g[u].size(); ++i) {node e = g[u][i];if (e.index > mid) continue;if (used[e.to]) continue;if (dfs1(e.to)) return 1;}return 0;
}bool dfs2(int u) {if (u == n) return 1;used[u] = 1;for (int i = 0; i < g[u].size(); ++i) {node e = g[u][i];if (e.index > mid) continue;if (used[e.to]) continue;if (dfs2(e.to)) return 1;}return 0;
}int main() {init();scanf("%d%d ", &n, &m);for (int i = 1; i <= m; ++i) {getchar();scanf("%d ", &from);scanf("%s ", op);getchar();scanf("%d ", &to);if (from == to) continue;if ('<' == op[0]) {g[from].push_back(node(to, i));}else if ('=' == op[0]) {g[from].push_back(node(to, i));g[to].push_back(node(from, i));}}if (n == 1) {printf("0\n");return 0;} int ans = -1;le = 0, ri = m;while (le + 1 < ri) {mid = (le + ri) >> 1;memset(used, 0, sizeof(used));bool ok = dfs1(n);memset(used, 0, sizeof(used));if (ok || dfs2(1)) { ans = mid; ri = mid; }else { le = mid; }}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465453.html

hihocoder 1689 - 推断大小关系(图论+二分)相关推荐

  1. C语言 比较字符串的大小关系

    头文件 原型 说明 返回值 #include<stdio.h> int strcmp(const char *s1, const char *s2) 比较s1指向的字符串和s2指向的字符串 ...

  2. 判断两个IP大小关系及是否在同一个网段中

    功能点 判断某个IP地址是否合法 判断两个IP地址是否在同一个网段中 判断两个IP地址的大小关系 知识准备 IP协议 子网掩码 Java 正则表达式 基本原理 IP地址范围 0.0.0.0-255.2 ...

  3. 相机成像原理之物像之间的大小关系换算

    同一物体用相同的相机进行拍摄,物体在像中的大小与拍摄距离及拍摄角度相关,以下分别画图说明拍摄距离及拍摄角度变化,物象大小关系的换算 相机拍摄物象大小关系图如下 其中根据图中关系可以计算像的大小为其中f ...

  4. 【集合论】二元关系 ( 特殊关系类型 | 空关系 | 恒等关系 | 全域关系 | 整除关系 | 大小关系 )

    文章目录 一. 特殊关系 二. 集合上的特殊关系 三. 整除关系 四. 大小关系 一. 特殊关系 特殊二元关系 : 空关系 恒等关系 全域关系 整除关系 小于等于关系 包含关系 真包含关系 二. 集合 ...

  5. Hex文件和bin文件以及flash大小关系

    Program Size: Code=31128 RO-data=6572 RW-data=52 ZI-data=1852 keil软件编译后会出现上面的提示,其意义如下: Code:指程序中代码的字 ...

  6. 关于OF CF 标志位对于判定两整数大小关系(无符号数及有符号数情况)作用的讨论

    在x-86 64 IA32 体系下,处理器通过对两数求差(保存或不保存结果)然后读取被改变的条件码来判定结果的正负,进而得知两整数大小关系.其背后的逻辑关系设计非常精妙,然而大部分书籍资料中都只是一笔 ...

  7. Brenda应用(2.0) - 构建(酶, 物质, 关系)0-1表格用于NBI推断新关系

    本文是<Brenda应用(2) - 构建(酶, 物质, 关系) 0-1表格用于NBI推断新关系>的第一篇:数据获取. 目录 目标 输出 实现 数据来源 问题 应用/测试 针对于感兴趣的十种 ...

  8. 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)

    题干: Calculate the number of toys that land in each bin of a partitioned toy box.  Mom and dad have a ...

  9. 力扣35-搜索插入位置(C++,左右闭区间,nums[mid]与target大小关系判断的不同及辨析)

    题目要求时间复杂度logN,所以肯定是用二分算法了,采用的是非递归,[left,right]闭区间的那种解法.两种分支的不同仅在于nums[mid]与target的大小判断语句及相关操作上.看测试用例 ...

最新文章

  1. 键盘回车事件导致页面刷新的问题
  2. 一文学懂Java泛型,详细而全面,值得收藏~
  3. 帆软日期格式转换_时间转换为年月日
  4. vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
  5. Spring+Mybatis多数据源配置
  6. 第 2-1 课:类与 Object + 面试题
  7. 用LinkedList模拟栈(Java容器)
  8. CFileStatus 使用详解
  9. win10中VM15内centos7的安装
  10. 服务器之间远程拷贝scp
  11. tail 查看文件末尾n行、日志持续追踪
  12. 测试视频软件支持的格式,支持82种视频格式!电视平台最强的本地播放器!
  13. 【数据结构】图的基础练习题目,及题解
  14. Pytorch ——基础指北_零 [神经元和激活函数介绍]
  15. 电商之 团购与B2C模式以及B2B2C模式对比
  16. 股市实时行情分发工具-拿来就用
  17. DDD与数据事务脚本
  18. three.js加载和使用纹理-specularMap使用高光贴图创建色彩鲜明的地球(vue中使用three.js77)
  19. wifi 框架流程分析
  20. sklearn学习笔记(1)—make_blobs函数及参数

热门文章

  1. oracle linux6 u盘安装,Oracle Enterprise Linux/Redhat Linux 6.0 U盘安装方法
  2. 客户机-服务器系统,什么是客户机/服务器计算
  3. HTTP的长链接和短链接说明
  4. 操作系统:UNIX、Linux、IOS、Android之间的渊源
  5. 这几个 IntelliJ IDEA 高级调试技巧,用了都说爽!
  6. Shell重定向的概念笔记
  7. ajxs跨域 php_PHP项目中是如何处理Ajax请求与Ajax跨域的
  8. 布法罗博士计算机专业回国人员,四名UW学生参加爱达荷州国家实验室的实习计划...
  9. python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数)
  10. angelica类似_亲爱的当归(Angelica)是第一个让我哭泣的VR体验