http://poj.org/problem?id=2983

  最短路专题中的一道用到Bellman-Ford算法的题。

  先简单描述题目的意思:

  两个王国将开展一场星级战争,其中一个国家的防御系统被出卖,但是其中的信息有真有假。现在给出某些防御塔间的位置关系,判断是否有矛盾,有矛盾就是不可信,否则就是可信。其中有些是知道具体的相对位置,其余的知知道大概的相对方向,而且各个防御塔都是在南北向的一条直线上。

  根据题意,就可以知道这是要判断是否有矛盾的信息,换句话说就是要判断是否有负权的回路。其中,较为简单而且经典的方法就是Bellman Ford的算法。

  根据《算法导论》描述:

  这个算法能在一般的情况(存在负权边的情况)下,解决单源最短路径问题。对于给定的带权有向图G=(V, E),其源点为s,加权函数为w:E→R,对该图运行Bellman-Ford算法后可以返回一个布尔值,表明图中是否存在一个从源点可达的权为负的回路。若存在这样的回路的话,算法说明该问题无解;若不存在这样的回路,算法将产生最短路径及其权值。

For i:=1 to |V|-1 do
For 每条边(u,v)∈E doRelax(u,v,w);
For每条边(u,v)∈E doIf dis[u]+w<dis[v] Then Exit(False)
http://www.nocow.cn/index.php?title=Bellman-Ford%E7%AE%97%E6%B3%95&oldid=8177#.E6.94.B9.E8.BF.9B.E5.92.8C.E4.BC.98.E5.8C.96
  这个算法的时间复杂度是O(VE),用于判断是否有负权回路时,它还能稍作优化,我的代码中已实现:
View Code

 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5  6 #define Infp 0x7fffffff 7 #define Infn 0x80000000 8 #define DisCon 1000000000 9 #define MAX  99999999910 #define MIN -99999999911 12 #define Z(a) memset(a, 0, sizeof(a))13 #define C(a, b) memcpy(a, b, sizeof(b))14 #define Pi acos(-1)15 #define FMAX (1E300)16 #define FMIN (-1E300)17 #define feq(a, b) (fabs((a)-(b))<1E-6)18 #define flq(a, b) ((a)<(b)||feq(a, b))19 #define RG 100520 21 struct Edge22 {23     int b;24     int e;25     int dis;26 }e[200010];//简单的记录边的信息27 28 int bell(int en, int pn)29 {30     int dis[pn+1];31     int chg;32 33     dis[0]=0;34     for(int i=1; i<=pn; i++)35         dis[i]=DisCon;//这是为了防止溢出才不用最大值36     for(int i=0; i<pn; i++)37     {38         chg=0;39         for(int j=0; j<en; j++)40             if(dis[e[j].e]>dis[e[j].b]+e[j].dis)//松弛操作41             {42                 dis[e[j].e]=dis[e[j].b]+e[j].dis;43                 chg=1;//如果最终趋于稳定,就是说肯定没有负权回路了44             }45         if(!chg)return 1;46 /*************解释*****************************47 结合《算法导论》的解释,如果从单源出发,而且图是无负权回路的,48 那么到任何一个短点的最短路径最多只包含|V|-1条边,而上述代码最49 外层的循环次数是|V|次,就是最多将构造含有|V|条边的最短路集合。50 假设循环不断进行,一直有最短路被发现(也即一直有松弛的路径更新51 ),直到i>|V|而退出,这说明这时构造出了一条最短路是有多于|V|条52 边的,与初衷矛盾,所以这时说明了图是有负权回路的!53 *********************************************/54     }55     return 0;56 }57 58 int main()59 {60     int N, M;61 62     while(scanf("%d%d", &N, &M)!=EOF)63     {64         int en=0;65         while(M--)66         {67             getchar();68 69             char c;70             scanf("%c", &c);71             if(c=='P')//具体的信息,双向的边都要构造72             {73                 int a, b, dis;74 75                 scanf("%d%d%d", &a, &b, &dis);76                 e[en].b=a;77                 e[en].e=b;78                 e[en++].dis=dis;79                 e[en].b=b;80                 e[en].e=a;81                 e[en++].dis=-dis;82             }83             else//模糊的信息,据说边长一定大于1,只构造单向的边84             {85                 int a, b;86                 scanf("%d%d", &a, &b);87                 e[en].b=b;88                 e[en].e=a;89                 e[en++].dis=-1;90             }91         }92 93         if(bell(en, N))printf("Reliable\n");94         else printf("Unreliable\n");95     }96 97     return 0;98 }

UPD:  看了下差分约束做,结果反而不能1y了。。- -

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5
 6 using namespace std;
 7
 8 const int N = 1111;
 9 const int M = 111111;
10 const int INF = 0x11111111;
11 struct Edge {
12     int u, v, c;
13     Edge() {}
14     Edge(int u, int v, int c) : u(u), v(v), c(c) {}
15 } edge[M << 1];
16 int dis[N];
17
18 bool bellman(int m) {
19     bool ok;
20     for (int i = 0; i < N; i++) dis[i] = INF;
21     for (int i = 0; i < N; i++) {
22         ok = true;
23         for (int j = 0; j < m; j++) {
24             if (dis[edge[j].v] > dis[edge[j].u] + edge[j].c) {
25                 dis[edge[j].v] = dis[edge[j].u] + edge[j].c;
26                 ok = false;
27             }
28         }
29         if (ok) return true;
30     }
31     return false;
32 }
33
34 int main() {
35 //    freopen("in", "r", stdin);
36     int n, m;
37     int x, y, c;
38     char buf[3];
39     while (~scanf("%d%d", &n, &m)) {
40         int cnt = 0;
41         for (int i = 0; i < m; i++) {
42             scanf("%s%d%d", buf, &x, &y);
43             if (buf[0] == 'P') {
44                 scanf("%d", &c);
45                 edge[cnt++] = Edge(x, y, c);
46                 edge[cnt++] = Edge(y, x, -c);
47             } else edge[cnt++] = Edge(y, x, -1);
48         }
49         if (bellman(cnt)) puts("Reliable");
50         else puts("Unreliable");
51     }
52     return 0;
53 }

View Code

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/04/05/poj_2983_Lyon.html

poj 2983 Is the Information Reliable?相关推荐

  1. POJ 2983 Is the Information Reliable?(差分约束系统)

    题目大意:已知关于在一条直线上的n个点的m条信息,信息分为两类, 1.准确信息:P A B X 表示A在B的北方X光年: 2.模糊信息:V A B 表示A在B的北方1光年以北. 问所给信息是否自相矛盾 ...

  2. POJ 2983-Is the Information Reliable?(差分约束系统)

    题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...

  3. POJ 2983(差分约束系统)

    POJ 2983 (1)题意: 有两种信息, P A B X表示A在B点的北边的准确距离为X V A B表示A在B的北边,但是具体的距离不确定,但是距离一定大于1. 询问是否存在一种情况使N个据点满足 ...

  4. 【poj2983】 Is the Information Reliable?

    http://poj.org/problem?id=2983 (题目链接) 一个SB错误TLE了半个小时... 题意 一条直线上有n个点,给出m条信息,若为P则表示点A在点B的北方X米,若为V则表示A ...

  5. POJ 2983 浅谈差分约束系统处理严格等价性问题

    世界真的很大 差分约束系统,基于SPFA算法的复数不等关系判别及求值的系统 但是如果是完全等价的关系呢?或者说是混合式的等价关系? 当然是可以处理的,只不过需要恰恰转化一下,这个等价转不等算是差分约束 ...

  6. I won't tell you this is about graph theory----zjfc bellman-ford算法与spfa算法

    题目描述 To think of a beautiful problem description is so hard for me that let's just drop them off. :) ...

  7. 十分钟轻松学会python-10分钟轻松学会python turtle绘图

    python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle 先说明一下turtl ...

  8. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  9. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

最新文章

  1. Windows10为什么自带Linux,一直没有发现原来 Win10 内置了一个 Linux
  2. 基于空间金字塔池化的卷积神经网络物体检测
  3. 关于主键的设计、primary key
  4. C#在线打开编辑保存Excel文件[pageoffice]
  5. 单片机两个IO口控制三个LED灯
  6. jqGrid colModel 参数(来自中文手册)
  7. 电脑计算机配置应用程序兼容性,软件和系统不兼容怎么办 电脑禁用程序兼容助手服务的操作方法...
  8. 如何复习备考计算机二级c语言,2019年计算机二级C语言备考有哪些经验?
  9. SNF快速开发平台项目实践介绍
  10. 登录界面---油管大佬
  11. 前端:打开你的摄像头
  12. java se版本_补装老版本的Java SE
  13. htonl,htons 和 ntohs相关问题
  14. 电脑接口自动测试软件,通过多种接口总线与计算机实现自动检定/校准测试系统的设计...
  15. DTX1800校准的意义?---DTX-1800线缆测试仪此校准而非彼校准
  16. 第063讲: 论一只爬虫的自我修养11:Scrapy框架之初窥门径 | 学习记录(小甲鱼零基础入门学习Python)
  17. uni-app自定义组件
  18. mac安装oh-my-zsh出现command not found: npm问题解决
  19. win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法
  20. 转载别人下载资源神器

热门文章

  1. 记录一次@Transactional问题处理
  2. 哈希表数据结构_Java数据结构哈希表如何避免冲突
  3. 计算机控制中mcu,MCU学习1:单片机控制应用很广,它在智能控制中起什么作用?...
  4. 安卓文本编辑器php cpp,开源的Android富文本编辑器
  5. linux 多个select,Linux select()和多个套接字的FIFO排序?
  6. jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...
  7. python 复数求模_Python基础语法知识汇总(学习党的最爱!)
  8. javascript中数据类型及转换、String()和toString()的区别
  9. LAMP环境下配置虚拟主机和域名的跳转
  10. C++ 普通函数和模板函数调用规则