poj 2983 Is the Information Reliable?
最短路专题中的一道用到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),用于判断是否有负权回路时,它还能稍作优化,我的代码中已实现:
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?相关推荐
- POJ 2983 Is the Information Reliable?(差分约束系统)
题目大意:已知关于在一条直线上的n个点的m条信息,信息分为两类, 1.准确信息:P A B X 表示A在B的北方X光年: 2.模糊信息:V A B 表示A在B的北方1光年以北. 问所给信息是否自相矛盾 ...
- POJ 2983-Is the Information Reliable?(差分约束系统)
题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...
- POJ 2983(差分约束系统)
POJ 2983 (1)题意: 有两种信息, P A B X表示A在B点的北边的准确距离为X V A B表示A在B的北边,但是具体的距离不确定,但是距离一定大于1. 询问是否存在一种情况使N个据点满足 ...
- 【poj2983】 Is the Information Reliable?
http://poj.org/problem?id=2983 (题目链接) 一个SB错误TLE了半个小时... 题意 一条直线上有n个点,给出m条信息,若为P则表示点A在点B的北方X米,若为V则表示A ...
- POJ 2983 浅谈差分约束系统处理严格等价性问题
世界真的很大 差分约束系统,基于SPFA算法的复数不等关系判别及求值的系统 但是如果是完全等价的关系呢?或者说是混合式的等价关系? 当然是可以处理的,只不过需要恰恰转化一下,这个等价转不等算是差分约束 ...
- 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. :) ...
- 十分钟轻松学会python-10分钟轻松学会python turtle绘图
python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle 先说明一下turtl ...
- POJ 图论分类 + DP(较全 自己又加了点)
DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
最新文章
- Windows10为什么自带Linux,一直没有发现原来 Win10 内置了一个 Linux
- 基于空间金字塔池化的卷积神经网络物体检测
- 关于主键的设计、primary key
- C#在线打开编辑保存Excel文件[pageoffice]
- 单片机两个IO口控制三个LED灯
- jqGrid colModel 参数(来自中文手册)
- 电脑计算机配置应用程序兼容性,软件和系统不兼容怎么办 电脑禁用程序兼容助手服务的操作方法...
- 如何复习备考计算机二级c语言,2019年计算机二级C语言备考有哪些经验?
- SNF快速开发平台项目实践介绍
- 登录界面---油管大佬
- 前端:打开你的摄像头
- java se版本_补装老版本的Java SE
- htonl,htons 和 ntohs相关问题
- 电脑接口自动测试软件,通过多种接口总线与计算机实现自动检定/校准测试系统的设计...
- DTX1800校准的意义?---DTX-1800线缆测试仪此校准而非彼校准
- 第063讲: 论一只爬虫的自我修养11:Scrapy框架之初窥门径 | 学习记录(小甲鱼零基础入门学习Python)
- uni-app自定义组件
- mac安装oh-my-zsh出现command not found: npm问题解决
- win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法
- 转载别人下载资源神器
热门文章
- 记录一次@Transactional问题处理
- 哈希表数据结构_Java数据结构哈希表如何避免冲突
- 计算机控制中mcu,MCU学习1:单片机控制应用很广,它在智能控制中起什么作用?...
- 安卓文本编辑器php cpp,开源的Android富文本编辑器
- linux 多个select,Linux select()和多个套接字的FIFO排序?
- jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...
- python 复数求模_Python基础语法知识汇总(学习党的最爱!)
- javascript中数据类型及转换、String()和toString()的区别
- LAMP环境下配置虚拟主机和域名的跳转
- C++ 普通函数和模板函数调用规则