2014 Super Training #6 B Launching the Spacecraft --差分约束
原题:ZOJ 3668 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3668
典型差分约束题。
将sum[0] ~ sum[n] 作为节点,A<=sum[R]-sum[L-1]<=B可以分别建边:
x(L-1)-->xR w = B
xR --> x(L-1) w = -A
注意还有 -10000<=sum[i]-sum[i-1]<=10000 (for i in (2,n)),所以相邻点之间还要建边,(WA了很多次)这样的话就不用另加节点来使联通了,因为必会连通。如果出现负环,则无解。
用SPFA求最短路并判负环,求出的节点的dis[i]如果为INF,则任意取值(事实上此题不会),否则dis[i]就是sum[i],然后根据sum数组两两之间差值来求出a[i]。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define Mod 1000000007
using namespace std;
#define N 10017 vector<pair<int,int> > G[N];
int dis[N],inq[N],cnt[N];
int sum[N];
int n,m;
queue<int> que; bool SPFA(int s)
{
int u,v,i,w;
for(i=;i<=n;i++)
{
inq[i] = ;
dis[i] = Mod;
cnt[i] = ;
}
while(!que.empty())
que.pop();
que.push(s);
dis[s] = ;
cnt[s] = ;
inq[s] = ;
//for(i=0;i<=n;i++)
//que.push(i);
while(!que.empty())
{
u = que.front();
que.pop();
inq[u] = ;
for(i=;i<G[u].size();i++)
{
v = G[u][i].first;
w = G[u][i].second;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(!inq[v])
{
inq[v] = ;
cnt[v]++;
if(cnt[v] >= n+)
return false;
que.push(v);
}
}
}
}
return true;
} int main()
{
int i,j;
int L,R,A,B;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=;i<=n+;i++)
G[i].clear();
while(m--)
{
scanf("%d%d%d%d",&L,&R,&A,&B);
G[R].push_back(make_pair(L-,-A));
G[L-].push_back(make_pair(R,B));
}
for(i=;i<=n;i++)
{
G[i].push_back(make_pair(i-,));
G[i-].push_back(make_pair(i,));
}
if(SPFA())
{
for(i=;i<=n+;i++)
{
if(dis[i] != Mod)
sum[i] = dis[i];
else
sum[i] = sum[i-];
}
printf("%d",sum[]);
for(i=;i<=n;i++)
printf(" %d",sum[i]-sum[i-]);
printf("\n");
}
else
puts("The spacecraft is broken!");
}
return ;
}
2014 Super Training #6 B Launching the Spacecraft --差分约束的更多相关文章
- 2014 Super Training #8 B Consecutive Blocks --排序+贪心
当时不知道怎么下手,后来一看原来就是排个序然后乱搞就行了. 解法不想写了,可见:http://blog.csdn.net/u013368721/article/details/28071241 其实就 ...
- 2014 Super Training #8 A Gears --并查集
题意: 有N个齿轮,三种操作1.操作L x y:把齿轮x,y链接,若x,y已经属于某个齿轮组中,则这两组也会合并.2.操作Q x y:询问x,y旋转方向是否相同(等价于齿轮x,y的相对距离的奇偶性). ...
- 2014 Super Training #9 E Destroy --树的直径+树形DP
原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...
- 2014 Super Training #9 C E - Cup 2 --记忆化搜索
原题:ZOJ 3681 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3681 题意:给一个m,n,m表示m个人,可以把m个 ...
- 2014 Super Training #6 H Edward's Cola Plan --排序+二分
原题: ZOJ 3676 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3676 题意:给每个朋友一瓶可乐,可乐有普通和高 ...
- 2014 Super Training #7 F Power of Fibonacci --数学+逆元+快速幂
原题:ZOJ 3774 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3774 --------------------- ...
- 2014 Super Training #7 C Diablo III --背包问题(DP)
原题: ZOJ 3769 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3769 一个带有一些限制的背包问题. 假设在没有限 ...
- 2014 Super Training #7 E Calculate the Function --矩阵+线段树
原题:ZOJ 3772 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3772 这题算是长见识了,还从没坐过矩阵+线段树的题 ...
- 2014 Super Training #7 B Continuous Login --二分
原题:ZOJ 3768 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3768 一个结论:一个正整数总能用不超过三个前n项相 ...
随机推荐
- svn 大全
环境:Win7 32 bit SVN简介:程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是一 ...
- [Tool] 使用Visual Studio Code开发TypeScript
[Tool] 使用Visual Studio Code开发TypeScript 注意 依照本篇操作步骤实作,就可以在「Windows」.「OS X」操作系统上,使用Visual Studio Code ...
- ListView的addHeaderView()方法相关问题
使用listView.addHeaderView(view) 可以在 listView 上方添加一个view视图 ,使listView和这个view连接在一起 效果上看上去是一个整体 一般用于上拉刷新 ...
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath不执行的问题
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...
- 关于android4.3 Intel X86 Atom System Image的下载
今天建立android4.3模拟器的时候发现没有android4.3 Intel X86 Atom System Image可选,打开android SDK Manager 于是希望重现选择下载安装, ...
- 物联网网络编程、Web编程综述
本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真 ...
- LeetCode 2 Add Two Numbers(链表操作)
题目来源:https://leetcode.com/problems/add-two-numbers/ You are given two linked lists representing two ...
- 第k大的数,前k大的数
1.排序后去出前k个,o(n*log(n)) 如果k<log(n),可以考虑直接选择排序,因为只需要执行找到第k个就可以结束 o(n*k) 2.o(nlog(k))快排把数分为了两个部分, ...
- PowerDesigner执行SQL生成模型
PowerDesigner版本:15.2.0 步骤如下: 1.打开PowerDesigner软件如下图: 2.选择:File->Reverse Engineer->Database... ...
- Java读写txt文件
1.Java读取txt文件 1.1.使用FileInputStream: public static String readFile(File file, String charset){ //设置默 ...