题意:

      给你一些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查分约束,判断关系是否唯一的更多相关文章

  1. codevs 1242 布局(查分约束+SPFA)

    /* 查分约束. 给出的约束既有>= 又有<= 这时统一化成一种 Sb-Sa>=x 建边 a到b 权值为x Sb-Sa<=y => Sa-Sb>=-y 建边 b到a ...

  2. 洛谷P1993 小 K 的农场(查分约束)

    /* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...

  3. poj 1201 Interval (查分约束)

    /* 数组开大保平安. 查分约束: 输入的时候维护st和end 设每个点取元素di个 维护元素个数前缀和s Sbi-Sai-1>=ci 即:建立一条从ai-1到bi的边 权值为ci 表示ai到b ...

  4. BZOJ2330 糖果题解 查分约束

    BZOJ 2330 糖果题解 差分约束系统 + SPFA 题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 Description ...

  5. POJ1364基本的查分约束问题

    题意:       给了由n个数组成的一个数列,然后给你各种区间的和是大于ci还是小于ci啥的,最后问你是否冲突. 思路:       差分约束水题,不过wa了两次,原因处理区间问题的细节马虎了,说下 ...

  6. zoj Burn the Linked Camp (查分约束)

    Burn the Linked Camp Time Limit: 2 Seconds      Memory Limit: 65536 KB It is well known that, in the ...

  7. poj 1364 查分约束

    #include<stdio.h> #include<iostream> #include<stack> #include<string.h> usin ...

  8. hdu 1384 查分约束

    #include<stdio.h> /* 要善于挖掘隐含条件 dis[v]-dis[u]>=bian[i].w;一个条件(u,v,bian[i].w); dis[i+1]>=d ...

  9. Integer Intervals POJ - 1716_查分约束_

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...

随机推荐

  1. YSU小吃街

    贪心贪不过,暴力搜就完事了 注意不连通情况 #include<iostream> #include<sstream> #include<cstdio> #inclu ...

  2. Kafka SASL ACL配置踩坑总结

    源起:工程现阶段中间件采用的是kafka.满足了大数据的高吞吐,项目间的解耦合,也增强了工程的容错率与扩展性.但是在安全这一块还有漏洞,kafka集群中,只要网站内的任何人知道kafka集群的ip与t ...

  3. 什么原因才是阻碍Linux桌面发展的罪魁祸首

    我大概2000年上大学在宿舍开始玩Linux,到现在20年了!也算是最早一批痴迷于Linux桌面用户啦!记得当时的毕业设计BBS论坛开发就是在Mandrake Linux(后改名Mandriva,一种 ...

  4. Shiro反序列化<=1.2.4 复现

    Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.    shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到reme ...

  5. SpringMVC源码分析和启动流程

    https://yq.aliyun.com/articles/707995 在Spring的web容器启动时会去读取web.xml文件,相关启动顺序为:<context-param> -- ...

  6. 解决send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

    1:检查sendmail服务的状态 service sendmail status 2:开启sendmail服务 service sendmail start3:关闭sendmail服务 servic ...

  7. [深搜]A. 【例题1】拔河比赛

    A . [ 例 题 1 ] 拔 河 比 赛 A. [例题1]拔河比赛 A.[例题1]拔河比赛 解析 模板题,选与不选 Code #include <bits/stdc++.h> #defi ...

  8. [BFS]最小转弯问题

    最小转弯问题 Description 给出一张地图,这张地图被分为 n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平 ...

  9. Dynamic CRM登陆界面的客制化(持续更新)

    Dynamic CRM的登陆页面比较西化,不是很适合中国人使用.目前先把注销跳转的问题解决了. 服务端使用下面命令,将文件导出来 Export-AdfsWebTheme –Name default – ...

  10. BUAA_OO_第四单元

    一.UML解析器设计 ​ 先看下题目:第四单元实现一个基于JDK 8带有效性检查的UML(Unified Modeling Language)类图,顺序图,状态图分析器 MyUmlInteractio ...