POJ1094查分约束,判断关系是否唯一
题意:
给你一些a<b的关系,然后有三组询问。
1 当前这组之后如果能确定这n个数的大小关系,那么就输出关系
2 当前时候出现bug,就是和前面如果冲突,那么就不行
3 最后的答案是否是不确定的,就是既没确定关系,也没出现bug.
思路:
这个题目要清楚一点就是处理顺序,上面的三个情况可能会出现重叠的情况,那么就按照上面的1 2 3的优先级来处理,至于判断当前关系是否成立和唯一我用的是差分约束,没有用拓扑排序,差分约束跑完最短路(或者最长路)没有死环,就证明没有bug,而任意点到起点的距离都不重复,那么就是唯一,否则就是当前不能确定,还有就是讨论组里面有个人给了两组数据,我觉得很有用,我就直接粘贴过来吧,为了大家方便理解题意。
分享两组关键性数据:
Posted by MyTalent at 2013-05-08 23:24:07 on Problem 1094
6 6
A<F
B<D
C<E
F<D
D<E
E<F
output:
Inconsistency found after 6 relations.
5 5
A<B
B<C
C<D
D<E
E<A
output:
Sorted sequence determined after 4 relations: ABCDE
第一个例子讲述的是:矛盾和多选,优先判断是否矛盾
第二个例子讲述的是:在矛盾之前如果有成功的,算是成功
#include<queue>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N_node 30
#define N_edge 1000
#define INF 100000000
using namespace std;
typedef struct
{
int to ,cost ,next;
}STAR;
typedef struct
{
int id ,v;
}ANS;
int list[N_node] ,tot;
int mks[N_node] ,mkt[N_node];
int s_x[N_node];
char str[1000+5][5];
STAR E[N_edge];
ANS ans[N_edge];
void add(int a ,int b ,int c)
{
E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot;
}
bool camp(ANS a ,ANS b)
{
return a.v < b.v;
}
bool Spfa(int s ,int n)
{
for(int i = 0 ;i <= n ;i ++)
s_x[i] = INF;
memset(mks ,0 ,sizeof(mks));
memset(mkt ,0 ,sizeof(mkt));
queue<int>q;
q.push(s);
s_x[s] = 0;
mks[s] = mkt[s] = 1;
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
mks[tou] = 0;
for(int k = list[tou] ;k ;k = E[k].next)
{
xin = E[k].to;
if(s_x[xin] > s_x[tou] + E[k].cost)
{
s_x[xin] = s_x[tou] + E[k].cost;
if(!mks[xin])
{
mks[xin] = 1;
if(++mkt[xin] >= n) return 0;
q.push(xin);
}
}
}
}
return 1;
}
bool judeok(int n ,int id)
{
for(int i = 1 ;i <= n ;i ++)
{
ans[i].id = i;
ans[i].v = s_x[i];
}
sort(ans + 1 ,ans + n + 1 ,camp);
for(int i = 2 ;i <= n ;i ++)
if(ans[i].v == ans[i-1].v)
return 0;
printf("Sorted sequence determined after %d relations: " ,id);
for(int i = 1 ;i <= n ;i ++)
printf("%c" ,ans[i].id + 'A' - 1);
printf(".\n");
return 1;
}
int main ()
{
int n ,m ,i;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
for(i = 1 ;i <= m ;i ++)
scanf("%s" ,str[i]);
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= n ;i ++)
add(0 ,i ,0);//虚拟出来一个0点,连接所有点,为了防止整个图不是连通的
for(i = 1 ;i <= m ;i ++)
{
int a = str[i][0] - 'A' + 1;
int b = str[i][2] - 'A' + 1;
add(b ,a ,-1);
int now = Spfa(0 ,n);
if(now && judeok(n ,i)) break;
if(!now)
{
printf("Inconsistency found after %d relations.\n" ,i);
break;
}
}
if(i == m + 1)
{
printf("Sorted sequence cannot be determined.\n");
continue;
}
}
return 0;
}
POJ1094查分约束,判断关系是否唯一的更多相关文章
- codevs 1242 布局(查分约束+SPFA)
/* 查分约束. 给出的约束既有>= 又有<= 这时统一化成一种 Sb-Sa>=x 建边 a到b 权值为x Sb-Sa<=y => Sa-Sb>=-y 建边 b到a ...
- 洛谷P1993 小 K 的农场(查分约束)
/* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...
- poj 1201 Interval (查分约束)
/* 数组开大保平安. 查分约束: 输入的时候维护st和end 设每个点取元素di个 维护元素个数前缀和s Sbi-Sai-1>=ci 即:建立一条从ai-1到bi的边 权值为ci 表示ai到b ...
- BZOJ2330 糖果题解 查分约束
BZOJ 2330 糖果题解 差分约束系统 + SPFA 题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 Description ...
- POJ1364基本的查分约束问题
题意: 给了由n个数组成的一个数列,然后给你各种区间的和是大于ci还是小于ci啥的,最后问你是否冲突. 思路: 差分约束水题,不过wa了两次,原因处理区间问题的细节马虎了,说下 ...
- zoj Burn the Linked Camp (查分约束)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
- poj 1364 查分约束
#include<stdio.h> #include<iostream> #include<stack> #include<string.h> usin ...
- hdu 1384 查分约束
#include<stdio.h> /* 要善于挖掘隐含条件 dis[v]-dis[u]>=bian[i].w;一个条件(u,v,bian[i].w); dis[i+1]>=d ...
- Integer Intervals POJ - 1716_查分约束_
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
随机推荐
- java 方法详解
什么是方法 方法的定义和调用 值传递与引用传递 值传递:指的是在方法调用时,传递的是参数是按值的拷贝传递. 特点:传递的是值的拷贝,也就是传递后就互不相关了. 引用传递:指的是在方法调用时,传递的参数 ...
- FreeBSD Fcitx 输入法框架设置
#FreeBSD# 在.cshrc和/etc/csh.cshrc中进行如下配置,此配置可以解决部分窗口fcitx无效的问题. setenv QT4_IM_MODULE fcitx setenv GTK ...
- FreeBSD 12.2 vmware 虚拟机镜像 bt 种子
安装了 KDE5 火狐浏览器 Fcitx 输入法 并进行了中文设置 替换软件源为国内可用. VirtualBox虚拟机也可以用 magnet:?xt=urn:btih:E88885631B57426 ...
- 前后端分离之DRF——1
1. 作用 1. 序列化,序列化器会把模型对象转成字典,经过 response 以后变成 json 字符串 2. 反序列化,把客户端发送过来的数据,经过 request 以后变成字典,序列化器可以把字 ...
- vue 页面生成图片保存
需求:将页面中的元素转成图片,支持保存或下载.要求下载的图片包含页面背景,头像,用户名,文本为"我的邀请码"和个人二维码. 实现:将页面绘制到canvas中,生成base64图片链 ...
- css实现0.5像素的底边框。
由于设计图的1px在移动端开发中的像素比是2倍,在实际开发中却是需要1px的线条,虽然最直接的方式是将线条设置为0.5px,但有些移动端对于0.5px的解析为0,变成了无边框的显示.因此处理该需求我们 ...
- golang 实现距离幂算法
func main() { var test []Pow var x1 Pow x1.distance = 110 x1.grade = 0.31 var x2 Pow x2.distance = 8 ...
- L3-021 神坛 (叉积排序+向量积求面积)
题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805046577840128 题意:给定n个点求三角形最小面积: ...
- 12、django.urls.exceptions.NoReverseMatch:
问题: django.urls.exceptions.NoReverseMatch: Reverse for 'project_star' with keyword arguments '{'proj ...
- ES9的新特性:异步遍历Async iteration
ES9的新特性:异步遍历Async iteration 目录 简介 异步遍历 异步iterable的遍历 异步iterable的生成 异步方法和异步生成器 简介 在ES6中,引入了同步iteratio ...