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=+;//点的数量
int n,m,k;
int u[+],v[+];
int dis1[maxn],dis2[maxn];
bool flag1[maxn],flag2[maxn];
vector<int>P[maxn];
vector<int>FP[maxn];
queue<int>Q1;
queue<int>Q2; struct Edge
{
int from, to, cap, flow;
Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f) {}
};
vector<Edge>edges;
vector<int>G[maxn*];
bool vis[maxn*];
int d[maxn*];
int cur[maxn*];
int s, t; void read()
{
for(int i=;i<=m;i++)
{
scanf("%d%d",&u[i],&v[i]);
P[u[i]].push_back(v[i]);
FP[v[i]].push_back(u[i]);
}
} void init()
{
for(int i=;i<maxn;i++) P[i].clear();
for(int i=;i<maxn;i++) FP[i].clear(); for(int i=;i<=n;i++) dis1[i]=INF,dis2[i]=INF; for(int i = ; i < *maxn; i++) G[i].clear();
edges.clear();
} void AddEdge(int from, int to, int cap)
{
edges.push_back(Edge(from, to, cap, ));
edges.push_back(Edge(to, from, , ));
int w = edges.size();
G[from].push_back(w - );
G[to].push_back(w - );
} bool BFS()
{
memset(vis, , sizeof(vis));
queue<int>Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while (!Q.empty())
{
int x = Q.front();
Q.pop();
for (int i = ; i<G[x].size(); i++)
{
Edge e = edges[G[x][i]];
if (!vis[e.to] && e.cap>e.flow)
{
vis[e.to] = ;
d[e.to] = d[x] + ;
Q.push(e.to);
}
}
}
return vis[t];
} int DFS(int x, int a)
{
if (x == t || a == )
return a;
int flow = , f;
for (int &i = cur[x]; i<G[x].size(); i++)
{
Edge e = edges[G[x][i]];
if (d[x]+ == d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
{
edges[G[x][i]].flow+=f;
edges[G[x][i] ^ ].flow-=f;
flow+=f;
a-=f;
if(a==) break;
}
}
if(!flow) d[x] = -;
return flow;
} int dinic(int s, int t)
{
int flow = ;
while (BFS())
{
memset(cur, , sizeof(cur));
flow += DFS(s, INF);
}
return flow;
} void spfa1(int x)
{
while(!Q1.empty()) Q1.pop();
memset(flag1,,sizeof flag1); dis1[x]=;
flag1[x]=;
Q1.push(x); while(!Q1.empty())
{
int h=Q1.front(); flag1[h]=; Q1.pop();
for(int i=;i<P[h].size();i++)
{
if(dis1[h]+<dis1[P[h][i]])
{
dis1[P[h][i]]=dis1[h]+;
if(flag1[P[h][i]]==)
{
flag1[P[h][i]]=;
Q1.push(P[h][i]);
}
}
}
}
} void spfa2(int x)
{
while(!Q2.empty()) Q2.pop();
memset(flag2,,sizeof flag2); dis2[x]=;
flag2[x]=;
Q2.push(x); while(!Q2.empty())
{
int h=Q2.front(); flag2[h]=; Q2.pop();
for(int i=;i<FP[h].size();i++)
{
if(dis2[h]+<dis2[FP[h][i]])
{
dis2[FP[h][i]]=dis2[h]+;
if(flag2[FP[h][i]]==)
{
flag2[FP[h][i]]=;
Q2.push(FP[h][i]);
}
}
}
}
} int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
if(!n&&!m&&!k) break; init();
read(); spfa1();
spfa2(n); s=;t=n+n; for(int i=;i<=n;i++) AddEdge(i+n,i,); for(int i=;i<=m;i++)
if(dis1[u[i]]+dis2[v[i]]+<=k)
AddEdge(u[i],v[i]+n,INF); int ans=dinic(s,t);
printf("%d\n",ans);
}
return ;
}

HDU 2485 Destroying the bus stations的更多相关文章

  1. HDU 2485 Destroying the bus stations(!最大流∩!费用流∩搜索)

    Description Gabiluso is one of the greatest spies in his country. Now he’s trying to complete an “im ...

  2. 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)

    Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...

  3. HDU 2485 Destroying the bus stations (IDA*+ BFS)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意:给你n个点,m条相连的边,问你最少去掉几个点使从1到n最小路径>=k,其中不能去掉1, ...

  4. HDU 2485 Destroying the bus stations(费用流)

    http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意: 现在要从起点1到终点n,途中有多个车站,每经过一个车站为1时间,现在要在k时间内到达终点,问至少要 ...

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

    题意: 最少需要几个点才能使得有向图中1->n的距离大于k. 分析: 删除某一点的以后,与它相连的所有边都不存在了,相当于点的容量为1.但是在网络流中我们只能直接限制边的容量.所以需要拆点来完成 ...

  6. HDUOJ----2485 Destroying the bus stations(2008北京现场赛A题)

    Destroying the bus stations                                                                          ...

  7. Destroying the bus stations

    Destroying the bus stations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1832   Acce ...

  8. Destroying the bus stations HDU - 2485(最小割点)

    题意: 就是求最小割点 解析: 正向一遍spfa 反向一遍spfa  然后遍历每一条边,对于当前边 如果dis1[u] + dis2[v] + 1 <= k 那么就把这条边加入到网络流图中, 每 ...

  9. POJ 3921 Destroying the bus stations 沿着最短路迭代加深搜索

    题目:给出一个图,问最少删除多少个点,使得从点1到点n经过的点数超过k个. 分析: 上网搜了一下,发现很多人用网络流做的,发现我不会.再后来看到这篇说网络流的做法是错的,囧. 后来发现点数有点少,直接 ...

随机推荐

  1. thinkphp的目录结构设计经验总结1

    ---恢复内容开始--- 用thinkphp开发了好些项目了:最近准备抽空写一些经验总结: 希望能给刚开始接触tp的童鞋们提供一些开发的方案:少走一些弯路:少踩一些坑: 这些绝对都是些精华干货:耐着性 ...

  2. RESTful架构2--架构详解

    转自:RESTful架构详解 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在200 ...

  3. linux配置java环境变量(转)

    linux配置java环境变量(详细) 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586. ...

  4. what a malloc has to do

    1) Allocate a chunk of memory big enough to satisfy the request, and return a pointer to it.2) Remem ...

  5. NSArray的排序问题

    1.关于NSArray的排序问题,首先想到的是不是冒泡排序,插入排序....... oc中的NSArray有一种更简单的方式: 例如: NSArray *stringArray=[NSArray ar ...

  6. Linux下查看USB设备的VID、PID命令

    Linux下查看PID命令 cat /proc/bus/usb/devices 或 lsusb 方法一:在/etc/init.d/rcS中添加mount -t usbfs none /proc/bus ...

  7. Puppent 基本使用方法

    简单的文件配置 master端 vim /etc/puppet/manifests/site.pp ###########################内容如下 node default{ file ...

  8. TextUtils判断

    System.out.println(TextUtils.isEmpty(null)); System.out.println(TextUtils.isEmpty(""));

  9. C++11 半同步半异步线程池的实现

    #include <list> #include <mutex> #include <thread> #include <condition_variable ...

  10. Java导出Excel表(poi)名中文乱码问题处理

    <pre name="code" class="java">String _filename = ValidateTools.date2Str(da ...