CodeVS 2306晨跑 解题报告 最小费用最大流
Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等等,不过到目前为止,他坚持下来的只有晨跑。
现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发跑到学校,保证寝室编号为1,学校编号为N。
Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天数尽量长。
除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计一套满足他要求的晨跑计划。
第一行:两个数N,M。表示十字路口数和街道数。
接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。
两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长度。
7 10
1 2 1
1 3 1
2 4 1
3 4 1
4 5 1
4 6 1
2 5 5
3 6 6
5 7 1
6 7 1
2 11
对于30%的数据,N ≤ 20,M ≤ 120。
对于100%的数据,N ≤ 200,M ≤ 20000。
//CodeVS 2306晨跑 最小费用最大流 #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #define maxn 205 #define maxm 20005 using namespace std; int d[maxn<<1], head[maxn<<1], next[maxm<<2], v[maxm<<2], w[maxm<<2], c[maxm<<2], N, M, tot=1, pre[maxn<<1], vis[maxn<<1], ans, e[maxn<<1], cnt; queue<int> q; void add(int x, int y, int z, int cc) {v[++tot]=y;w[tot]=z;c[tot]=cc;next[tot]=head[x];head[x]=tot;} bool spfa() { int p, x, t; memset(d,0x3f,sizeof(d)); memset(vis,0,sizeof(vis)); while(!q.empty())q.pop(); d[N+1]=0;vis[N+1]=true;q.push(N+1); while(!q.empty()) { x=q.front();q.pop(); for(p=head[x];p;p=next[p]) { if( c[p] && d[x]+w[p]<d[t=v[p]]) { d[t]=d[x]+w[p]; pre[t]=x,e[t]=p; if(!vis[t])vis[t]=true,q.push(t); } } vis[x]=false; } return d[N]!=0x3f3f3f3f; } void augment() { int t=N, p; while(t!=N+1) { p=e[t]; c[p]--;c[p^1]++; t=pre[t]; } ans+=d[N]; } int main() { int i, j, x, y, z; scanf("%d%d",&N,&M); for(i=1;i<=N;i++) add(i,N+i,0,1),add(N+i,i,0,0); for(i=1;i<=M;i++) { scanf("%d%d%d",&x,&y,&z); add(x+N,y,z,1);add(y,x+N,-z,0); } while(spfa())cnt++,augment(); printf("%d %d\n",cnt,ans); return 0; }
测试点#run0.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#run1.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#run2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#run3.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#run4.in 结果:AC 内存使用量: 492kB 时间使用量: 44ms
测试点#run5.in 结果:AC 内存使用量: 364kB 时间使用量: 10ms
测试点#run6.in 结果:AC 内存使用量: 492kB 时间使用量: 45ms
测试点#run7.in 结果:AC 内存使用量: 744kB 时间使用量: 143ms
测试点#run8.in 结果:AC 内存使用量: 748kB 时间使用量: 97ms
测试点#run9.in 结果:AC 内存使用量: 1132kB 时间使用量: 386ms