hdu 3491 Thieves
来源:互联网 发布:东方日升数据造假 编辑:程序博客网 时间:2024/05/21 06:43
拆点+建边
//最好设源点为0,终点为2*n+1,否则H点会可能有流出,S点可能 //建边时要考虑四个点,两两之间的建边 #include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define mem(a, b) memset(a, b, sizeof(a))typedef long long ll;const int maxn=410;struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f): from(u),to(v),cap(c),flow(f){}};struct Dinic{ int n,m,s,t; vector<Edge>edges; vector<int>G[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; void init(int n){ for(int i=0;i<=2*n+1;i++) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap){ edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS(){ mem0(vis); queue<int>Q; Q.push(s); d[s]=0; vis[s]=1; while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow){ vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } int DFS(int x,int a){ if(x==t||a==0) return a; int flow=0,f; for(int& i=cur[x];i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } return flow; } int Maxflow(int s,int t){ this->s=s; this->t=t; int flow=0; while(BFS()){ mem0(cur); flow+=DFS(s,INF); } return flow; }};Dinic ZYC;int main(){ int t,n,m,S,H,x; scanf("%d",&t); while(t--){ scanf("%d%d%d%d",&n,&m,&S,&H); ZYC.init(n); for(int i=1;i<=n;i++){ scanf("%d",&x); if(i!=S&&i!=H){ ZYC.AddEdge(i,i+n,x); } else ZYC.AddEdge(i,i+n,INF); } ZYC.AddEdge(0,S,INF); ZYC.AddEdge(H+n,2*n+1,INF); int a,b; while(m--){ scanf("%d%d",&a,&b); ZYC.AddEdge(a+n,b,INF); ZYC.AddEdge(b+n,a,INF); } printf("%d\n",ZYC.Maxflow(0,2*n+1)); } return 0;}
0 0
- hdu 3491 Thieves
- hdu 3491 Thieves
- hdu 3491 Thieves
- HDU-3491 Thieves
- hdu 3491 Thieves(最小割拆点)
- HDU 3491 Thieves | 最小割
- 【HDU】3491 Thieves 最小点割集
- hdu 3491 Thieves 最小割
- Thieves HDU
- HDU 3491 Thieves 【拆点+最大流】
- hdu 3491 Thieves(最小割)
- HDU 3491 Thieves 拆点 最小割
- Thieves (hdu 3491 拆点 最小割)
- HDU 3491 Thieves(经典拆点建图,割点)
- HDU 3491 Thieves 最小点割集+拆点==最大流(建图可贵)
- 【网络流】 HDOJ 3491 Thieves
- hdoj 3491 Thieves 【最小割点集】
- hdoj--3491--Thieves(最小割点集)
- ViewPager滑动页面
- C++函数间数据传递方式
- 2012年5月SAT香港真题解析
- checkbox的常用操作
- Eclipse中设置编码的方式
- hdu 3491 Thieves
- 关于左侧面板中滚动条信息(怎么在不知情的情况下查看页面每个模块的信息)
- Zookeeper之Zab协议介绍(一)
- Flip Game
- IIS7.5 安装Drupal之Error 500问题的解决
- Maven标签
- Mathematica 有关向量与矩阵的函数
- 逻辑表达式
- 您应该关注的几个eclipse插件