HDU 2485

http://acm.hdu.edu.cn/showproblem.php?pid=2485

n个车站,m条边,两边之间费用为1,问最少摧毁多少车站,使得1-n无法在k时间内到达

将2-(n-1)每个点拆成两个,并建立容量为1,费用为0的一条边,源点为1,汇点为2*n-2,这时求最小费用最大流,其中保证dis[t]<=k,求得的最大流即为摧毁的车站数量(因为1流量代表能从其中一个车站到达n点)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std ;
const int INF=0xfffffff ;
struct node{
int s,t,cap,cost,nxt ;
}e[200005] ;
int sumflow ;
int n,m,k,cnt,head[1005],vis[1005],dis[1005],pre[1005] ;
void add(int s,int t,int cap,int cost)
{
e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap=0 ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
}
int spfa(int s,int t,int N)
{
for(int i=0 ;i<=N ;i++)
dis[i]=INF ;
dis[s]=0 ;
memset(vis,0,sizeof(vis)) ;
memset(pre,-1,sizeof(pre)) ;
vis[s]=1 ;
queue <int> q ;
q.push(s) ;
while(!q.empty())
{
int u=q.front() ;
q.pop() ;
vis[u]=0 ;
for(int i=head[u] ;i!=-1 ;i=e[i].nxt)
{
int tt=e[i].t ;
if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
{
dis[tt]=dis[u]+e[i].cost ;
pre[tt]=i ;
if(!vis[tt])
{
vis[tt]=1 ;
q.push(tt) ;
}
}
}
}
if(dis[t]==INF || dis[t]>k)return 0 ;
return 1 ;
}
int MCMF(int s,int t,int N)
{
int flow,minflow,mincost ;
mincost=flow=0 ;
while(spfa(s,t,N))
{
minflow=INF ;
for(int i=pre[t] ;i!=-1 ;i=pre[e[i].s])
minflow=min(minflow,e[i].cap) ;
flow+=minflow ;
for(int i=pre[t] ;i!=-1 ;i=pre[e[i].s])
{
e[i].cap-=minflow ;
e[i^1].cap+=minflow ;
}
mincost+=dis[t]*minflow ;
}
sumflow=flow ;//最大流
return mincost ;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&k))
{
if(!n && !m && !k)break ;
cnt=0 ;
memset(head,-1,sizeof(head)) ;
int s=1 ;
int t=2*n-2 ;
for(int i=1 ;i<n-1 ;i++)
add(2*i,2*i+1,1,0) ;
while(m--)
{
int a,b ;
scanf("%d%d",&a,&b) ;
a-- ;b-- ;
add(a*2+1,b*2,1,1) ;
}
MCMF(s,t,t) ;
printf("%d\n",sumflow) ;
}
return 0 ;
}

HDU 2485,码迷,mamicode.com

时间: 2024-10-13 22:46:32

HDU 2485的相关文章

hdu 2485 Highways

题意:Flatopia岛要修路,这个岛上有n个城市,要求修完路后,各城市之间可以相互到达,且修的总路程最短.求所修路中的最长的路段 最小生成树的一道题,很裸的一道题,不知道为什么就是编译过不了. #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int w[200000],u[200000],v[200000],p[5

hdu 2485 Destroying the bus stations 迭代加深搜索

求最少去掉几个公交站使得从s到t的最短路径大于k. 迭代加深搜索. #include <cstdio> #include <cstring> #include <queue> using namespace std; #define maxn 60 #define maxm 50000 int n,m,K,cnt,up; int head[maxn],pre[maxn]; int road[maxn][maxn]; bool del[maxn]; queue<in

HDU 2485 求删最少点使得 边权=1的有向图最短路&gt;k

题意: 给定n个点 m条有向边 k 下面m条有向边 问删最少几个点使得1-n的最短路>k 10 11 5 1 2 2 3 3 4 4 5 5 10 2 9 1 6 6 7 7 8 8 9 9 10 8 10 5 1 2 2 3 3 4 4 5 5 6 6 8 1 7 7 8 4 7 7 4 #include <stdio.h> #include <string.h> #define N 55 #define INF 1<<30 #define eps 1e-5 i

HDU 2485 Destroying the bus stations(费用流)

http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意: 现在要从起点1到终点n,途中有多个车站,每经过一个车站为1时间,现在要在k时间内到达终点,问至少要破坏多少个车站. 思路: 把每个点拆分为两个点,容量为1,费用为0.之后相邻的车站连边,容量为INF,费用为1,表示经过一个车站需要1时间. 这样一来,跑一遍费用流计算出在费用不大于k的情况下的最大流,也就是最小割,即至少要破坏的车站数. 在网络中寻求关于f的最小费用增广路,就等价于在伴随网络中寻求

hdu 2485 Destroying the bus stations 最小费用最大流

题意: 最少需要几个点才能使得有向图中1->n的距离大于k. 分析: 删除某一点的以后,与它相连的所有边都不存在了,相当于点的容量为1.但是在网络流中我们只能直接限制边的容量.所以需要拆点来完成对的点容量的限制.对于边i -> j,先建边i ->i',再建i'->j.i ->i'只能建一次,容量为1,费用为0.i'->j的容量是INF.此题中因为已经有源点,所以源点(1)不能限制容量. 1 #include<iostream> 2 #include<c

HDU 2485 Destroying the bus stations

2015 ACM / ICPC 北京站 热身赛 C题 #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; const int INF=0x7FFFFFFF; const int maxn=50+10;//点的数量 int n,m,k; in

Destroying the bus stations (hdu 2485 网络流+最短路)

Destroying the bus stations Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2313    Accepted Submission(s): 739 Problem Description Gabiluso is one of the greatest spies in his country. Now he'

目前待补完清单

Hdu 2485  70% CodeForces Gym 100825C 30% CodeForces 292C 0% CodeForces 293B 0%

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i