【East!模拟赛】【Round1】【BZOJ2324】营救皮卡丘 有下界的费用流

题意:不多说了。

题解:

begin

首先想到:我们要强制走过那些下界。

怎么强制呢?我们把费用赋为-inf!!看他走不走!

然后费用的初值就需要把这些扣掉的inf加回来。

end.

贴代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 500
#define M 201000
#define inf 2000000
using namespace std;
struct KSD
{
	int u,v,w,len,next;
}e[M<<3];/*瞎开的大小*/
int head[N],cnt;/*网络流图*/
void add(int u,int v,int w,int len)
{
	++cnt;
	e[cnt].u=u,e[cnt].v=v,e[cnt].w=w;
	e[cnt].len=len,e[cnt].w=w;
	e[cnt].next=head[u],head[u]=cnt;
}
int map[N][N];/*预处理的floyd图*/
int n,m,p;

int S,s,T;
long long dist[N],fee;
int pre[N];
bool in[N];

long long spfa()
{
	memset(dist,0x3f,sizeof(dist));
	queue<int>q;
	int i,u,v;
	dist[S]=0;
	in[S]=1;
	q.push(S);
	while(!q.empty())
	{
		u=q.front();q.pop();in[u]=0;
		for(i=head[u];i;i=e[i].next)
		{
			v=e[i].v;
			if(!e[i].len)continue;
			if(dist[v]>dist[u]+e[i].w)
			{
				dist[v]=dist[u]+e[i].w;
				pre[v]=i;
				if(!in[v])
				{
					in[v]=1;
					q.push(v);
				}
			}
		}
	}
	return dist[T];
}
void handle()
{
	for(int i=pre[T];i;i=pre[e[i].u])
	{
		e[i].len-=1;
		e[i^1].len+=1;
	}
}
void build()
{
	int i,j;
	cnt=1;
	s=0,S=2*n+1,T=2*n+2;
	add(S,s,0,p);
	add(s,S,0,0);
	add(s,T,0,p);
	add(T,s,0,0);
	for(i=1;i<=n;i++)
	{
		add(s,i*2-1,map[s][i],1);
		add(i*2-1,s,-map[s][i],0);

		add(i*2-1,i*2,-inf,1);
		add(i*2,i*2-1,inf,0);

		add(i*2,T,0,1);
		add(T,i*2,0,0);
	}
	for(i=1;i<=n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			add(i*2,j*2-1,map[i][j],1);
			add(j*2-1,i*2,-map[i][j],0);
		}
	}
}
int main()
{
	freopen("B.in","r",stdin);
	freopen("B.out","w",stdout);
	int i,j,k;
	int a,b,c;
	scanf("%d%d%d",&n,&m,&p);
	memset(map,0x3f,sizeof(map));
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		map[a][b]=map[b][a]=min(map[a][b],c);
	}
	for(i=0;i<=n;i++)map[i][i]=0;
	for(k=0;k<=n;k++)for(i=0;i<=n;i++)for(j=0;j<=n;j++)if(k<=i||k<=j)map[i][j]=min(map[i][j],map[i][k]+map[k][j]);//floyd
	build();
	fee=inf*n;
	long long temp;
	while(temp=spfa(),temp<0x3f3f3f3f3f3f3f3fll)
	{
		fee+=temp;
		handle();
	}
	cout<<fee<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0;
}
时间: 2024-10-11 04:48:14

【East!模拟赛】【Round1】【BZOJ2324】营救皮卡丘 有下界的费用流的相关文章

bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)

2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1777  Solved: 712[Submit][Status][Discuss] Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救

【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流

[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须按照顺序先摧毁1到K-1号据点,并且,如

[BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘

[Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共同拥有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一開始K个人都在0号点. 因为火箭队的重重布防,要想摧毁K号据点,必须依照顺序先摧毁1到K-1号据点,而且,假设K-1号据点没有被摧毁,因

【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须

BZOJ2324 [ZJOI2011]营救皮卡丘 【费用流】

题目 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须按照顺序先摧毁1到K-1号据点,并且,如果K-1号据点没有被摧毁,由于防御的连锁性,小智一行任何一个人进入据点

BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )

昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1, 0)(从i点继续走), 0->yi(1, distance(0->i))(从0出发), xi->yi(1, distance(i->j))(i点走向j点), yi->T(1, 0)(每个点必须经过至少一次), 然后跑最小费用最大流, 费用即为答案. 写完这道题感觉...只是会

bzoj 2324 营救皮卡丘

2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1440  Solved: 560 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇

BZOJ 2324 营救皮卡丘(最小费用最大流)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2324 题意:n+1个城市(0到n).初始时K个 人都在0城市.城市之间有距离.要求(1)遍历完n个城市(有一个人遍历了某个城市就算这个城市被遍历了):(2)遍历i城市前必须遍历完前i-1个城 市,并且在遍历前i-1个城市时不能经过大于等于i的城市.在满足(1)(2)的前提下使得K个人走的总距离最小. 思路:我们先看在实际情况下可以怎么走. (1)某个人遍历完某个城市后停在那里,以后不再

BZOJ 2324: [ZJOI2011]营救皮卡丘

2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2340  Solved: 963[Submit][Status][Discuss] Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救