hdu 5294 Tricks Device (最短路+最大流)
来源:互联网 发布:双十一数据图 编辑:程序博客网 时间:2024/06/06 03:11
给一个无向图,问:
1、至少拆掉多少边可使得1到n无路径。
2、最多拆掉多少边可使得1到n仍然有路径。
对于第1问,同hdu 3599,点击打开链接
对于第2问,求出边数最少的最短路,总边数减掉该边数即可。
#include<iostream>#include<cstdio>#include<cmath>#include<map>#include<set>#include<algorithm>#include<queue>#include<stack>#include<cstdlib>#include<cstring>#include<vector>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;typedef long long LL;typedef unsigned long long uLL;typedef __int64 LI;typedef unsigned __int64 uLI;typedef unsigned int uI;typedef double db;#define maxn 2005#define inf 0x3f3f3f3fstruct e{ int to,cap,next;}e[1200005],e0[1200005];int cnt,head[maxn],d[maxn],s,t,n;inline void add(int u,int v,int w){ e[cnt].to=v; e[cnt].cap=w; e[cnt].next=head[u]; head[u]=cnt++; e[cnt].to=u; e[cnt].cap=0; e[cnt].next=head[v]; head[v]=cnt++;}inline bool bfs() //BFS构造层次图{ int u,i; queue<int> q; q.push(s); memset(d,0,sizeof(d)); d[s]=1; while(!q.empty()) { u=q.front();q.pop(); if(u==t) return true; //汇点的层次被算出即可停止,因为根据DFS的规则,和汇点同层或更下一层的结点是不可能走到汇点的。 for(i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!d[v]&&e[i].cap) { d[v]=d[u]+1; q.push(v); } } } return false;}int dfs(int u,int a) //当前结点、目前为止所有弧的最小残量{ int flow=0,f,i; if(u==t||a==0) return a; for(i=head[u];~i;i=e[i].next) { int v=e[i].to; if(e[i].cap&&d[v]==d[u]+1) //满足容量不为0且另一端是下一层次 { f=dfs(v,min(a,e[i].cap)); e[i].cap-=f; //削减路径上各边的容量 e[i^1].cap+=f;//添加反向边 flow+=f; //增加总流量 a-=f; //该结点之前的弧的最小残量削减f后的值 if(!a) break; //若为0,则无需再从该结点寻找增广路,因为位于该结点之前的某条弧削减f后会为0,导致无法从源点经过该结点再增广到汇点 } } if(flow==0) d[u]=0; //从该点出发找不到增广路,则将该点从层次图中去掉 return flow;}bool vis[maxn];int low[maxn],cnt0,head0[maxn],pre[maxn];inline void add0(int u,int v,int w){ e0[cnt0].to=v; e0[cnt0].cap=w; e0[cnt0].next=head0[u]; head0[u]=cnt0++;}int dis[maxn];void spfa(){ int i; memset(vis,0,sizeof(vis)); memset(low,inf,sizeof(low)); memset(pre,0,sizeof(pre)); memset(d,0,sizeof(d)); low[1]=0; vis[1]=1; queue<int> q; q.push(1); while(!q.empty()) { int u=q.front();q.pop(); vis[u]=0; for(i=head0[u]; ~i; i=e0[i].next) { int v=e0[i].to; if(low[v]>low[u]+e0[i].cap) { low[v]=low[u]+e0[i].cap; pre[v]=u; dis[v]=dis[u]+1; if(!vis[v]) { vis[v]=1; q.push(v); } } else if(low[u]+e0[i].cap==low[v]&&dis[v]>dis[u]+1) { pre[v]=u; dis[v]=dis[u]+1; if(!vis[v]) { vis[v]=1; q.push(v); } } } }}int dinic(){ int ans=0; for(int i=0;i<=n;++i) for(int j=head0[i];~j;j=e0[j].next) { int v=e0[j].to; if(e0[j].cap+low[i]==low[v]) add(i,v,1); } s=1,t=n; while(bfs()) ans+=dfs(s,inf); return ans;}int main(){ int a,b,c,m,i; while(~scanf("%d%d",&n,&m)){ for(i=1;i<=n;++i){ head[i]=head0[i]=-1; } cnt0=cnt=0; for(i=1;i<=m;++i){ scanf("%d%d%d",&a,&b,&c); add0(a,b,c); add0(b,a,c); } spfa(); if(n==1||low[n]==inf) puts("0 0"); else{ int x=n,ans=0; while(x!=1) { ++ans; x=pre[x]; } printf("%d %d\n",dinic(),m-ans); } } return 0;}
0 0
- Tricks Device (hdu 5294 最短路+最大流)
- hdu 5294 Tricks Device(最短路+最大流)
- hdu 5294 Tricks Device(最短路 + 最大流)
- hdu 5294 Tricks Device 最短路+最大流
- 多校 hdu 5294 Tricks Device 最短路+最大流
- HDU 5294 Tricks Device (最大流+最短路)
- 【HDU 5294】Tricks Device(最短路+最大流)
- hdu 5294 Tricks Device (最短路+最大流)
- HDU 5294Tricks Device(最短路+最大流)
- HDU 5294 Tricks Device(最短路+最大流)
- HDU 5294 Tricks Device(最短路+最大流)
- Tricks Device (最大流 , 最短路)
- HDU 5294 Tricks Device(多校2015 最大流+最短路啊)
- HDU 5294 Tricks Device 残余网络(最短路+最大流)**
- HDU 5294 Tricks Device 最短路建图+最小割(最大流)
- hdu 5294 Tricks Device(最短路)
- 【网络流+最短路】 HDU 5294 Tricks Device
- HDU 5294 Tricks Device (最短路+网络流)
- C#双击文件只让同一个程序打开文件
- oracle wm_concat函数,用于列转行,逗号分隔
- 记录一些易忘的属性(translucent,edgesForExtendedLayout,automaticallyAdjustsScrollViewInsets)
- Bone Collector II
- poj 1047 模拟(含大数乘法)循环数
- hdu 5294 Tricks Device (最短路+最大流)
- uvalive5798(树状数组)
- android mk脚本的编写
- VC 读写注册表
- 3.4 summary
- spring mvc中的@RequestMapping的用法
- C# UDP(Socket)异步传输文件
- 导致实例逐出的五大问题
- Lightoj 1094 - Farthest Nodes in a Tree 【树的直径裸题】