【Noip模拟 20161005】运货
问题描述
小ww开了一家快递公司,在nn个城市之间进行货物运输工作,一共雇了mm个快递员。 每个快递员性格很奇特,第ii号快递员只愿意将货物从城市sisi运送到titi(甚至不愿意将货物 从titi运送到sisi),并且如果他运送的货物量x≤dix≤di,那么他要求获得的报酬为x×aix×ai,否则为 di×ai+(x−di)×bidi×ai+(x−di)×bi。
现在小ww 接到一个大订单,需要将ff单位货物从ss 运送到tt,请求出小ww 的最小开支。 你可以假定每个快递员的运货量没有限制。
输入格式
第一行五个整数nn,mm,ss,tt,ff。
接下来mm行每行五个数sisi,titi,aiai,bibi,didi,描述一个快递员的信息。
输出格式
如有解请输出最小小开支,否则请输出Impossible。
输入样例
4 4 0 3 5
0 1 3 0 3
1 3 3 0 3
0 2 2 1 6
2 3 2 1 6
输出样例
18
数据范围
n≤100,m≤1000n≤100,m≤1000
si,ti,s,t≤n−1si,ti,s,t≤n−1
f,di≤200f,di≤200
ai,bi≤1000ai,bi≤1000.
保证至多只有一名邮递员ai<biai<bi,其余均是ai>biai>bi。
共5050组数据,保证数据有梯度。
交了7发,终于AC了,满满的都是泪。
#include<bits/stdc++.h>
using namespace std;
#define RE register long long
#define IL inline
#define N 101
#define M 1001
#define int long long
#define inf 21474983647
IL char gc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}template<class T>IL int read(T&x){
x=;register char c=gc();
while(c<)c=gc();
while(c>)x=(x<<)+(x<<)+(c^),c=gc();
}void write(RE x){
if (x>)write(x/);
putchar(x%^);
}int m,n,s,t,f,head[N],dis[N],cnt;
bitset<N>vis;
queue<int>q;
struct aa{int next,v,a,b,d;}e[M];
IL void addedge(RE u,RE v,RE a,RE b,RE d){e[++cnt]=(aa){head[u],v,a,b,d},head[u]=cnt;}
IL int work(RE i,RE x){return x<=e[i].d?x*e[i].a:e[i].d*e[i].a+(x-e[i].d)*e[i].b;}
IL int SPFA(RE u){memset(dis,0x3f,sizeof dis);
q.push(u),dis[u]=;
while (q.size()){
RE u=q.front();
q.pop(),vis[u]=;
for (RE v,i=head[u];i;i=e[i].next)
if (dis[v=e[i].v]>dis[u]+work(i,f)){
dis[v=e[i].v]=dis[u]+work(i,f);
if (!vis[v]) q.push(v),vis[v]=;
}
}return dis[t];
}signed main(){
read(n),read(m),read(s),read(t),read(f),++s,++t;
for (RE i=,s1,t,a,b,d;i^m;++i) read(s1),read(t),read(a),read(b),read(d),++s1,++t,addedge(s1,t,a,b,d);
RE ans=SPFA(s);
if (ans==inf)puts("Impoosble");
else write(ans);
}
100分代码
#include<bits/stdc++.h>
using namespace std;
#define RE register long long
#define IL inline
#define N 101
#define M 10001
#define int long long
#define inf 4557430888798830399
IL char gc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}template<class T>IL int read(T&x){
x=;RE f=;
register char c=gc();
while(c<)f|=c=='-',c=gc();
while(c>)x=(x<<)+(x<<)+(c^),c=gc();
if (f) x=-x;
}void write(RE x){if (x>) write(x/);
putchar(x%^);
}int ans,fi,m,n,s,t,f,cnt1,cnt2,head1[N],head2[N],dis1[N],dis2[N],d1[N][N],d2[N][N];
struct aa{int next,v,a,b,d;}e1[M],e2[M];
bitset<N>vis;
queue<int>q;IL void addedge1(RE u,RE v,RE a,RE b,RE d){
e1[++cnt1]=(aa){head1[u],v,a,b,d},head1[u]=cnt1;
}IL void addedge2(RE s,RE t,RE a,RE b,RE d){e2[++cnt2]=(aa){head2[s],t,a,b,d},head2[s]=cnt2;}
IL int work(int i,int x){return x<=e1[i].d?x*e1[i].a:e1[i].d*e1[i].a+(x-e1[i].d)*e1[i].b;}
IL int spfa1(RE u){q.push(u),dis1[u]=;
while(q.size()){
RE u=q.front();q.pop(),vis[u]=;
for (RE i=head1[u],v;i;i=e1[i].next)
if (dis1[v=e1[i].v]>dis1[u]+work(i,f)){
dis1[v]=dis1[u]+work(i,f);
if (!vis[v]) q.push(v),vis[v]=;
}
}return dis1[t];
}IL int spfa2(RE u){q.push(u),dis2[u]=;
while(q.size()){
RE u=q.front();q.pop(),vis[u]=;
for (RE v,i=head2[u];i;i=e2[i].next)
if (dis2[v=e2[i].v]>dis2[u]+work(i,f)){
dis2[v]=dis2[u]+work(i,f);
if (!vis[v]) q.push(v),vis[v]=;
}
}return dis2[s];
}void floyd(){
for (RE i=;i<=n;++i)
for (RE v,j=head1[i];j;j=e1[j].next)
d1[i][v=e1[j].v]=min(d1[i][v],work(j,e1[fi].d));
for (RE k=;k<=n;++k) for (RE i=;i<=n;++i)
for (RE j=;j<=n;++j) d1[i][j]=min(d1[i][j],d1[i][k]+d1[k][j]);
for (RE i=;i<=n;++i)
for (RE v,j=head1[i];j;j=e1[j].next)
if (j^fi) d2[i][v=e1[j].v]=min(d2[i][v],work(j,f-e1[fi].d));
for (RE k=;k<=n;++k) for (RE i=;i<=n;++i)
for (RE j=;j<=n;++j) d2[i][j]=min(d2[i][j],d2[i][k]+d2[k][j]);
}signed main(){
//freopen("transport.in","r",stdin),freopen("transport.out","w",stdout);
read(n),read(m),read(s),read(t),read(f),++s,++t;
for (RE s1,t1,a,b,d,i=;i<=m;++i){
read(s1),read(t1),read(a),read(b),read(d);
++s1,++t1;if (a<b) fi=i;
addedge1(s1,t1,a,b,d),addedge2(t1,s1,a,b,d);
}memset(dis1,0x3f,sizeof dis1),memset(dis2,0x3f,sizeof dis2);
memset(d1,0x3f,sizeof d1),memset(d2,0x3f,sizeof d2);
ans=spfa1(s);
if (fi&&e1[fi].d<f){
spfa2(t),floyd();
for (RE i=;i<=n;++i)
for (RE j=;j<=n;++j)
if (i^j&&dis1[i]^inf&&d1[i][j]^inf&&d2[i][j]^inf&&dis2[j]^inf)
ans=min(ans,dis1[i]+d1[i][j]+d2[i][j]+dis2[j]);
}if (ans==inf) puts("Impossible");
else cout<<ans;
}
代码说明
SPFA比较裸,跳过,注意下标要加一,神坑。我们在判断负环的时候,需要用两种情况来判断,我们先用暴力储存d1。然后用反向边再次跑一遍floyd存在d2,然后我们加起来就可以了。做负环题,就是要把环拆开变成两条边,就可以了。
最后我扯一点别的东西,请听下回分解。
【Noip模拟 20161005】运货的更多相关文章
- 【Noip模拟 20161005】友好城市
问题描述 小ww生活在美丽的ZZ国.ZZ国是一个有nn个城市的大国,城市之间有mm条单向公路(连 接城市ii.jj的公路只能从ii连到jj).城市ii.jj是友好城市当且仅当从城市ii能到达城市jj并 ...
- 【Noip模拟 20161005】公约数
问题描述 小ww最近仔细研究了公约数,他想到了以下问题:现有nn个正整数,从中选k(2≤k≤n)k(2≤k≤n) 个,设这kk个数的最大公约数为gg,则这kk个数的价值为k×gk×g.求这个价值的最大 ...
- noip模拟赛 运
[问题背景]zhx 和妹子们玩数数游戏.[问题描述]仅包含 4 或 7 的数被称为幸运数.一个序列的子序列被定义为从序列中删去若干个数, 剩下的数组成的新序列.两个子序列被定义为不同的当且仅当其中的元 ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- git 本地重命名文件夹大小写并提交到远程分支
git branch 查看本地分支 git branch -a 查看本地 本地分支可直接切换:git checkout name 进入正题: 1.文件夹备份 2.git config core.ign ...
- 使用pip命令自动生成项目安装依赖清单
Python项目中经常会带requirements.txt文件,里面是项目所依赖的包的列表,也就是依赖关系清单,这个清单也可以使用pip命令自动生成. pip命令: 1 pip freeze > ...
- Unity动画机制 Animator与Animator Controller教程
Unity动画机制Animator 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- LINUX文件删除,但磁盘空间未释放
最近在进行系统压测,由于服务器节点太多,便写了个简单的脚本,在执行过程中发现,日志文件删除后,磁盘空间只释放了一小部分,任有大部分磁盘空间未释放. 使用lsof | grep delete命令,发现已 ...
- css文本是否换行
关于文本换行有三个属性: white-space word-break word-wrap white-space normal 默认.空白会被浏览器忽略 pre 空白会被浏览器保留.其行为方式类似 ...
- 消息队列MQ】各类MQ比较
目前业界有很多MQ产品,我们作如下对比:RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级 ...
- socat管理haproxy以及haproxy调优
Unix套接字命令(Unix Socket commands) socat是一个多功能的网络工具,名字来由是“Socket CAT”,可以看作是netcat的N倍加强版,socat的官方网站:http ...
- 第一章 Html+Css使用总结(下)
1 开场 <!DOCTYPE html> <html lang="en"> <head> <!-- 对于中文网页需要使用 <meta ...
- django 路由分发
对于一个大的工程,可能会有很多应用,比如cmbd,moniter,openstack等等,我们就要用到路由分发 1,首先在跟工程同名的文件夹下的urls中写分发表: from django.conf. ...
- python永久添加环境变量
import sys sys.path 系统环境是一个list,可以将自己需要的库添加进入,例如mysql库,hive库等等.有三种方式添加,均验证通过: 1 临时添加,在一个shell窗口中 ...