hdu5249 Tricks Device(网络流最大匹配)
分析题意可知:
1、最少须要切断多少边使吴不能找到张(题意吴仅仅能走最短路径上面的边),对从起点到终点的最短路径又一次建图,每条边的权值为1。求最大流就可以
2、在吴能够找到张的前提下,最多能够切断边的数量:仅仅须要在全部最短路径中寻找一条经过边数量最少的最短路径,用边的总数减去它就可以(逆向思维)
代码例如以下:
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define MAXN 2010
#define INF 1e9+7
using namespace std;
struct Edge
{
int v,cost,cap;///v代表边的还有一个顶点。cost代表边的代价,cap代表反向边的位置
Edge(int _v=0,int _cost=0,int _cap=0):v(_v),cost(_cost),cap(_cap) {}
};
vector<Edge> g[MAXN];///保存地图
vector<int> pre[MAXN];///记录最短路径上每一个节点的父节点,用于构建网络流
int flag[MAXN][MAXN];///解决重边问题
int d[MAXN];///记录到达某一点的最短路径所经过的最短的边,用于求解问题2
int dist[MAXN];
struct qnode
{
int v;
int c;
qnode(int _v=0,int _c=0):v(_v),c(_c) {}
bool operator<(const qnode &r)const
{
return c>r.c;
}
};
int n,m;
int level[MAXN];
void Dijkstra(int s);
void addedge(int u,int v,int w,int cap);
void built(int u);
int DINIC(int s,int t);
int DFS(int now,int maxf,int t);
bool makelevel(int s,int t);
int main()
{
//FILE* fp = fopen("C:\\Users\\Crazy_Bear\\Desktop\\数据\\data1007\\1007.in","rw");
while(scanf("%d%d",&n,&m)==2)
{
memset(g,0,sizeof(g));
memset(flag,0,sizeof(flag));
int x,y,v;
for(int i=1; i<=m; ++i)
{
//fscanf(fp,"%d%d%d",&x,&y,&v);
scanf("%d%d%d",&x,&y,&v);
flag[x][y]++;///记录重边的数量
addedge(x,y,v,0);
flag[y][x]++;
addedge(y,x,v,0);
}
Dijkstra(1);
memset(g,0,sizeof(g));
built(n);///又一次建图
printf("%d %d\n",DINIC(1,n),m-d[n]);
}
// fclose(fp);
return 0;
}
void addedge(int u,int v,int w,int cap)
{
g[u].push_back(Edge(v,w,cap));
}
void Dijkstra(int s)
{
bool vis[MAXN];
for(int i=1; i<=n; ++i)
{
vis[i]=false;
dist[i]=INF;
pre[i].clear();
d[i]=INF;
}
priority_queue<qnode> pq;
while(!pq.empty()) pq.pop();
dist[s]=0;
d[s]=0;
pq.push(qnode(s,0));
qnode tmp;
while(!pq.empty())
{
tmp=pq.top();
pq.pop();
int u=tmp.v;
if(vis[u]) continue;
vis[u]=true;
for(int i=0; i<g[u].size(); ++i)
{
int v=g[u][i].v;
int cost=g[u][i].cost;
if(dist[v]==dist[u]+cost)
{
pre[v].push_back(u);///在求解最短路径的过程中记录父节点
d[v]=min(d[u]+1,d[v]);
}
else if(dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
pq.push(qnode(v,dist[v]));
d[v]=d[u]+1;
pre[v].clear();
pre[v].push_back(u);
}
}
}
}
void built(int u)
{
if(u==1)
return;
int len=pre[u].size();
for(int i=0; i<len; ++i)
{
if(flag[pre[u][i]][u]>0)
{
addedge(pre[u][i],u,1,g[u].size());
flag[pre[u][i]][u]--;
addedge(u,pre[u][i],1,g[pre[u][i]].size()-1);
flag[u][pre[u][i]]--;
built(pre[u][i]);
}
}
} bool makelevel(int s,int t)
{
memset(level,0,sizeof(level));
level[s]=1;
int que[MAXN];
int iq=0;
que[iq++]=s;
int top;
for(int i=0; i<iq; ++i)
{
top=que[i];
if(top==t) return true;
int len=g[top].size();
for(int i=0; i<len; ++i)
{
if(!level[g[top][i].v]&&g[top][i].cost)
{
que[iq++]=g[top][i].v;
level[g[top][i].v]=level[top]+1;
}
}
}
return false;
}
int DFS(int now,int maxf,int t)
{ if(now==t) return maxf;
int ret=0,f;
int len=g[now].size();
for(int i=0; i<len; ++i)
{
if(g[now][i].cost&&level[g[now][i].v]==level[now]+1)
{
f=DFS(g[now][i].v,min(maxf-ret,g[now][i].cost),t);
g[now][i].cost-=f;
g[g[now][i].v][g[now][i].cap].cost+=f;
ret+=f;
if(ret==maxf) return ret;
}
}
return ret;
}
int DINIC(int s,int t)
{
int ans=0;
while(makelevel(s,t)) ans+=DFS(s,INF,t);
return ans;
}
hdu5249 Tricks Device(网络流最大匹配)的更多相关文章
- HDU 5294 Tricks Device 网络流 最短路
Tricks Device 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 Description Innocent Wu follows D ...
- Tricks Device (hdu 5294 最短路+最大流)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 5294 Tricks Device 最短路建图+最小割
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...
- HDU 5294 Tricks Device (最大流+最短路)
题目链接:HDU 5294 Tricks Device 题意:n个点,m条边.而且一个人从1走到n仅仅会走1到n的最短路径.问至少破坏几条边使原图的最短路不存在.最多破坏几条边使原图的最短路劲仍存在 ...
- HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- SPFA+Dinic HDOJ 5294 Tricks Device
题目传送门 /* 题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路 SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cn ...
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...
- 2015 Multi-University Training Contest 1 Tricks Device
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- HDU 5294 Tricks Device(多校2015 最大流+最短路啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...
随机推荐
- CSS隐藏overflow默认滚动条同时保留滚动效果
主要应用于移动端场景,仿移动端滚动效果.对于隐藏滚动条,众所周知overflow:hidden,但是想要的滚动效果也没了. 所以对于移动端webkit内核提供一个伪类选择器: .element::-w ...
- (转)Epoll模型详解
1. 内核中提高I/O性能的新方法epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll.要使用epoll只需要这三个系统调 用:epoll_create(2), ...
- ZJOI—— 密码机(2003)
ZJOI2003密码机,没找到可以测试的网站,就只过了样例~~ 题目描述 一台密码机按照以下的方式产生密码:首先往机器中输入一系列数,然后取出其中一部分数,将它们异或以后得到一个新数作为密码.现在请你 ...
- java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6
package org.rui.thread.newc.semaphore; import java.util.ArrayList; import java.util.List; import jav ...
- iOS定义静态变量、静态常量、全局变量
静态变量 当我们希望一个变量的作用域不仅仅是作用域某个类的某个对象,而是作用域整个类的时候,这时候就可以使用静态变量. staticstatic修饰的变量,是一个私有的全局变量.C或者Java中sta ...
- Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解
data: uchar类型的指针,指向Mat数据矩阵的首地址.可以理解为标示一个房屋的门牌号: dims: Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处 ...
- javascript系列-class10.DOM(下)
1.node节点(更详细的获取(设置)页面中所有的内容) 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 元素是节点的别称,节点包含元素当然节点还有 ...
- vuejs2.0 文档
http://vuejs.org/ vuejs2.0 英文文档 https://vuefe.cn/ vuejs2.0 中文文档
- VBA 第一天
公司实习第一天,excel搞不定啊,学点VBA留着用: 录制宏: 点击录制宏按钮以后,在这段期间你做的每一个操作都会被记录下来,直到你点击停止录制按钮才能够停下,停下来后在此期间每一个操作都会以宏代码 ...
- ServiceStack.Redis之IRedisClient<第三篇>【转】
事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...