[AHOI2008]上学路线
题意:给定一个无向图,删除某些边有一定的代价,要求删掉使得最短路径减小,求最小代价。
首先要spfa求出起点到各个点的最短距离。对于一条权值为w,起点为i,终点为j的边,设dis[k]为起点到k点的距离,若dis[j]=dis[i]+w,则将该边加入另一个图里,边的容量为删除这条边的代价,则从起点到终点的最大流即为答案。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3fffffff;
const int Maxn=1100000;
int to[Maxn],nxt[Maxn],first[Maxn],t[Maxn],c[Maxn];
int w[Maxn],too[Maxn],nxtt[Maxn],firstt[Maxn];
int n,m,ti,co,u,v,tot=1,e[Maxn];
int b[Maxn],cur[Maxn],dis[Maxn];
inline void add(int u,int v,int ti,int co) {
to[tot]=v;
nxt[tot]=first[u];
t[tot]=ti;
c[tot]=co;
first[u]=tot++;
}
inline void add(int u,int v,int wi) {
too[tot]=v;
w[tot]=wi;
nxtt[tot]=firstt[u];
firstt[u]=tot++;
}
void spfa() {
queue<int>q;
memset(dis,0x3f,sizeof(dis));
memset(e,0,sizeof(e));
q.push(1);
dis[1]=0;
while(!q.empty()) {
int now=q.front();
q.pop();
e[now]=0;
for(int i=first[now];i;i=nxt[i])
if(dis[to[i]]>dis[now]+t[i]) {
dis[to[i]]=dis[now]+t[i];
if(e[to[i]]==0) {
q.push(to[i]);
e[to[i]]=1;
}
}
}
}
bool bfs() {
queue<int>q;
q.push(1);
memset(b,0,sizeof(b));
b[1]=1;
while(!q.empty()) {
int now=q.front();
q.pop();
for(int i=firstt[now];i;i=nxtt[i])
if(w[i]&&b[too[i]]==0) {
b[too[i]]=b[now]+1;
q.push(too[i]);
}
}
return b[n];
}
int dfs(int root,int flow) {
if(root==n) return flow;
for(int &i=cur[root];i;i=nxtt[i])
if(b[too[i]]==b[root]+1&&w[i]) {
int temp=dfs(too[i],min(w[i],flow));
if(temp) {
w[i]-=temp;
w[i^1]+=temp;
return temp;
}
}
return 0;
}
int dinic() {
int ans=0,temp;
while(bfs()) {
memcpy(cur,firstt,sizeof(cur));
while(temp=dfs(1,inf))
ans+=temp;
}
return ans;
}
int main() {
// freopen("test.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
scanf("%d%d%d%d",&u,&v,&ti,&co);
add(u,v,ti,co);
add(v,u,ti,co);
}
spfa();
tot=2;
for(int i=1;i<=n;i++)
for(int j=first[i];j;j=nxt[j])
if(dis[to[j]]==dis[i]+t[j]) {
add(i,to[j],c[j]);
add(to[j],i,0);
}
printf("%d\n%d\n",dis[n],dinic());
return 0;
}
[AHOI2008]上学路线的更多相关文章
- codevs2693 上学路线(施工)
难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...
- BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)
第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...
- BZOJ 3782: 上学路线 [Lucas定理 DP]
3782: 上学路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 192 Solved: 75[Submit][Status][Discuss] ...
- BZOJ_1266_[AHOI2006]上学路线route_最小割
BZOJ_1266_[AHOI2006]上学路线route_最小割 Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信 ...
- 【最短路+最大流】上学路线@安徽OI2006
目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...
- BJWC2018上学路线
题目描述 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B 喜欢走最短的 ...
- 洛谷 P4478 [BJWC2018]上学路线
洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...
- 洛谷——P1958 上学路线_NOI导刊2009普及(6)
P1958 上学路线_NOI导刊2009普及(6) 题目描述 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道.南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从 ...
- 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割
[BZOJ1266][AHOI2006]上学路线route Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林 ...
随机推荐
- object.prototype.call
object.prototype.call /* * object.prototype.call * @ 当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法 ...
- ios 在UIView上画图,线条
1.画线条(实线,虚线) - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext( ...
- Oracle入门笔记 ——启动
参考教材<深入浅出Oracle> 兴趣 + 勤奋 + 坚持 + 方法 ≍ 成功 DBA生存之四大守则 1.备份重于一切: 2.三思而后行: 3.rm是危险的: 4.你来制定规范: 第一章: ...
- Oracle预定义的21个系统异常类型
命名的系统异常 产生原因 ACCESS_INTO_NULL 未定义对象 CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 COLLECTION_IS_N ...
- postgresql架构基础(转)-(1)
PostgreSQL使用一种客户端/服务器的模型.一次PostgreSQL会话由下列相关的进程(程序)组成: 一个服务器进程,它管理数据库文件.接受来自客户端应用与数据库的联接并且代表客户端在数据库上 ...
- 理论实践:循序渐进理解AWR细致入微分析性能报告
1. AWR 概述 Automatic Workload Repository(AWR) 是10g引入的一个重要组件.在里面存贮着近期一段时间内(默认是7天)数据库活动状态的详细信息. AWR 报告是 ...
- 验证ip地址
package site.wangxin520.test; import sun.net.util.IPAddressUtil; public class Test { public static v ...
- CRM - 讲师与学生
一.讲师与学生简介 1.初始化 course_record, study_record.2.学习记录3.录入成绩4.显示成绩 ajax 查询 柱状图展示成绩 highcharts 5.上传作业(os模 ...
- 聪明的打字员---poj1184(bfs)
题目链接:http://poj.org/problem?id=1184 分析:首先可以发现有6*10^6种状态,比较多,不过搜索的时候可以去除一些无用的状态, 可以发现一个点的值(2-5)如果想要改变 ...
- laravel常用的artisan命令
转载来源链接: https://blog.csdn.net/jiandanokok/article/details/72897682 全局篇 查看artisan命令 php artisan php a ...