【UVA11478】Halum (最短路解差分约束)
题目:
Sample Input
2 1
1 2 10
2 1
1 2 -10
3 3
1 2 4
2 3 2
3 1 5
4 5
2 3 4
4 2 5
3 4 2
3 1 0
1 2 -1
Sample Output
Infinite
Infinite
3
1
题意:
给定一个有向图,每条边都有一个权值。每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大。
分析:
因为不同的操作互不影响,因此可以按任意顺序实施这些操作。另外,对于同一个点的多次操作可以合并,因此可以令sum(u)为作用于结点u之上的所有d之和。这样,本题的目标就是确定所有的sum(u),使得操作之后所有边权的最小值尽量大。
“最小值最大”又让我们想到使用二分答案的方法。二分答案x之后,问题转化为是否可以让操作完毕后每条边的权值均不小于x。对于边a->b,不难发现操作完毕后它的权值为w(a,b)+sum(a)-sum(b),因此每条边a->b都可以列出一个不等式w(a,b)+sum(a)-sum(b)>=x,移项得sum(b)-sum(a)<=w(a,b)-x。这样,我们实际得到一个差分约束系统。
差分约束系统是指一个不等式组,每个不等式形如xj-xi<=bk,这里的bk是一些事先已知的常数。这个不等式类似于最短路中的不等式d[v]<=d[u]+w(u,v),我们可以用最短路算法求解:对于约束条件xj-xi<=bk,新建一条边i->j,(根据最短路性质可以证明在图无负环的情况下这个不等式是成立的)权值为bk。如果图中有负权环,则差分约束系统无解。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 510
#define Maxm 4010
#define INF 0xfffffff int n,m;
int first[Maxn],dis[Maxn],cnt[Maxn];
bool bq[Maxn],inq[Maxn]; struct node
{
int x,y,c,cc,next;
}t[Maxm];int len; int mymax(int x,int y) {return x>y?x:y;} void ins(int x,int y,int cc)
{
t[++len].x=x;t[len].y=y;t[len].cc=cc;
t[len].next=first[x];first[x]=len;
} queue<int > q; bool spfa(int s)
{
memset(inq,,sizeof(inq));
memset(dis,,sizeof(dis));
memset(cnt,,sizeof(cnt));
while(!q.empty()) q.pop();
dis[s]=;inq[s]=;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();inq[x]=;
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(dis[y]>dis[x]+t[i].c)
{
dis[y]=dis[x]+t[i].c;
if(!inq[y])
{
q.push(y);
inq[y]=;
if(++cnt[y]>n+) return ;
}
}
}
}
return ;
} bool check(int x)
{
memset(bq,,sizeof(bq));
for(int i=;i<=len-n;i++) t[i].c=t[i].cc-x;
if(spfa(n+)) return ;
/*for(int i=1;i<=n+1;i++) if(!bq[i])
{
if(spfa(i)) return 0;
}*/
return ;
} void ffind(int l,int r)
{
while(l<r)
{
int mid=(l+r+)>>;
if(check(mid)) l=mid;
else r=mid-;
}
printf("%d\n",l);
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(first,,sizeof(first));
int mx=-INF;len=;
for(int i=;i<=m;i++)
{
int x,y,cc;
scanf("%d%d%d",&x,&y,&cc);
ins(x,y,cc);
mx=mymax(cc,mx);
}
for(int i=;i<=n;i++)
{
ins(n+,i,);t[len].c=;
}
if(check(mx+)) {printf("Infinite\n");continue;}
if(!check()) {printf("No Solution\n");continue;}
ffind(,mx);
}
return ;
}
[UVA11478]
2016-04-10 15:33:20
【UVA11478】Halum (最短路解差分约束)的更多相关文章
- 【POJ1021】Intervals (最短路解差分约束)
题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...
- UVA 11478 Halum(用bellman-ford解差分约束)
对于一个有向带权图,进行一种操作(v,d),对以点v为终点的边的权值-d,对以点v为起点的边的权值+d.现在给出一个有向带权图,为能否经过一系列的(v,d)操作使图上的每一条边的权值为正,若能,求最小 ...
- poj3169 最短路(差分约束)
题意:一个农夫有n头牛,他希望将这些牛按照编号 1-n排成一条直线,允许有几头牛站在同一点,但是必须按照顺序,有一些牛关系比较好,希望站的距离不超过某个值,而有一些牛关系不太好,所以希望站的距离大于等 ...
- poj3159 最短路(差分约束)
题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个. 这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 ...
- Halum UVA - 11478(差分约束 + 二分最小值最大化)
题意: 给定一个有向图,每条边都有一个权值,每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边权的最小值非负且尽量大 两个特判 1 ...
- POJ 2983 Is the Information Reliable? 信息可靠吗 (差分约束,spfa)
题意:有n个站排成一列,针对每个站的位置与距离关系,现有多个约束条件,约束条件分两种:(1)确定的.明确说明站a距离站b多少个单位距离.(2)不确定的.只知道a在b的左边至少1个单位距离. 根据已知 ...
- 【HDU3440】House Man (差分约束)
题目: Description In Fuzhou, there is a crazy super man. He can’t fly, but he could jump from housetop ...
- 差分约束算法————洛谷P4878 [USACO05DEC] 布局
题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn< ...
- 牛客Wannafly9E 组一组 差分约束
正解:差分约束 解题报告: 传送门! 首先肯定要想到把他们分开来考虑,就是说,把数二进制拆分掉,这样就可以分开考虑了嘛 然后考虑设f[i]:前i个数中的1的个数 然后就可以得到一堆差分约束的式子 然后 ...
随机推荐
- pcap的pcap_dump()保存的文件格式
(2009-09-01 20:36:49) 转载▼ 标签: 杂谈 分类: 专业 首先是tcpdump文件格式 当你在Windows或者Linux环境下用tcpdump命令抓取数据包时,你将得到如下格式 ...
- Quartz.NET simple_demo
Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和 ...
- Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者
首先我们示例工程一览表如下: 1.首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中定义了监听到广播,要执行的操作: ...
- linux下安装apache2.2.27
1.首先下载httpd-2.2.27.tar.gz用linux命令下载 wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.2.27.tar.gz 2 ...
- Linux下载jdk ,Linux如何下载jdk
Linux下载jdk Linux如何下载jdk >>>>>>>>>>>>>>>>>>> ...
- php快速定位多维数组的深度
原文地址:php快速定位多维数组的深度作者:陌上花开 自定义一个函数: function array_depth($array) { $max_depth = 1; foreach ($array ...
- 爆牙齿的 Web 标准面试题 【转藏】
<!DOCTYPE html> <html lang="zh-CN"><head> <meta http-equiv="cont ...
- site与subsite
1.List template只能加载在主站点上,加载在主站点上之后,其subsite也能引用: 2.发布webpart的时候,路径也只能写网站集的路径,发布到网站集之后其主站点和subsite都能引 ...
- (转)php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime. 下面首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日.上周.本月的起 ...
- 配置hive元数据库mysql时候出现 Unable to find the JDBC database jar on host : master
解决办法: cd /usr/share/java/,(没有java文件夹,自行创建)rz mysql-connector-java-***.jar,mv mysql-connector-java-* ...