题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2485

题目要求:删除最少的点,使得源点到汇点的距离大于k

思路:拆点、建图求费用小于等于k的最大流

#include <iostream>
#include <cstring>
#include <climits>
#include <cstdio>
#include <queue>
using namespace std;
#define min(x,y) (x)<(y)?(x):(y)
const int maxm = 10005;
const int maxn = 1100; struct node{
int v,flow,cost,next;
}edge[maxm];
int head[maxn],dis[maxn],vis[maxn],pre[maxn],cur[maxn];
int id,n,m,k;
int sink,source;
void add_edge(int u,int v,int flow,int cost){
edge[id].v = v;edge[id].cost = cost;edge[id].flow = flow;edge[id].next = head[u];head[u] = id++;
edge[id].v = u;edge[id].cost = -cost;edge[id].flow = 0 ;edge[id].next = head[v];head[v] = id++;
}
void init(){
int u,v,i;
source = 1,sink = n*2;
memset(head,-1,sizeof(head));id = 0;
for( i = 1; i <= m; i++){
scanf("%d%d",&u,&v);
add_edge(u+n,v,1,1);
}
for( i = 2; i < n; i++)//拆点
add_edge(i,i+n,1,0);
add_edge(1,n+1,5000000,0);
add_edge(n,n+n,5000000,0);
} int spfa(){
memset(dis,-1,sizeof(dis));
memset(vis,0,sizeof(vis));
pre[source] = source;
dis[source] = 0;
vis[source] = 1;
queue<int>que;
que.push(source);
while( !que.empty()){
int u = que.front();
que.pop();
vis[u] = 0;
for(int id = head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if(edge[id].flow > 0 && (dis[v] == -1 || dis[v] > dis[u] + edge[id].cost )){
dis[v] = dis[u] + edge[id].cost;
pre[v] = u;cur[v] = id;
if(!vis[v] ){
vis[v] = 1;
que.push(v);
}
}
}
}
if(dis[sink] == -1 || dis[sink] > k)return 0;
return 1;
} int get_max(){
int max_flow = 0;
while(spfa())
{
//cout << dis[sink] << endl;
max_flow += 1;
int now = sink;
while(now != source){
edge[cur[now]].flow -= 1;
edge[cur[now]^1].flow += 1;
now = pre[now];
}
}
return max_flow;
}
int main(){
freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&k),n||m||k){
init();
printf("%d\n",get_max());
}
return 0;
}

  

最新文章

  1. 反编译.NET工程
  2. ToolsCodeTemplate使用
  3. 模仿迅L看看&lt;音频播放器&gt; 实现点击进度条,跳转播放
  4. 备受SQL青睐的“1”
  5. C# 模拟提交 Form表单的数据
  6. WebService的介绍概念 收藏
  7. sql to_char 日期转换字符串
  8. [z] 人工智能和图形学、图像处理方面的各种会议的评级
  9. IoC 之 2.1 IoC基础(壹)
  10. php实现树状结构无级分类
  11. Newtonsoft.Json.dll反序列化JSON字符串的方法
  12. Ionic简介和环境安装
  13. 序列化- 使用BinaryFormatter进行序列化
  14. 实战-Mysql5.6.36脚本编译安装及初始化
  15. 【APS.NET 框架系列】浅谈ASP.NET 框架
  16. 详解EBS接口开发之库存事务处理批次更新
  17. linux中去掉^M的方法
  18. SATA主机协议的FPGA实现之物理层设计
  19. 每天CSS学习之text-decoration
  20. python 判断返回结果 in用法

热门文章

  1. CentOS7安装高版本gcc
  2. 新浪微博SSO授权后回调客户端没有执行sinaweiboDidLogIn&amp;无法返回应用
  3. Intent 使用详解
  4. kubernetes CRD开发指南
  5. Windows 下安装 Python + Django
  6. Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&amp;片段着色器
  7. HelloDjango 第 07 篇:创作后台开启,请开始你的表演!
  8. tensorflow学习笔记——多线程输入数据处理框架
  9. 逆向破解之160个CrackMe —— 014
  10. 番茄日志发布1.0.3版本-增加Kafka支持