poj 2125 Destroying The Graph 最小点权覆盖集
2015-11-18 21:14
465 查看
[code]#include<stdio.h> #include<string.h> #include<queue> #include<vector> using namespace std; const int N=1024; const int inf=1<<24; struct Edge { int from,to,cap,flow; }; struct node { int num,st; }; vector<Edge>edges; vector<int>G ; int s,t; int vis ; int d ; int cur ; int fa ; void AddEdge(int from,int to,int cap) { Edge tp; tp.from=from,tp.to=to,tp.cap=cap,tp.flow=0; edges.push_back(tp); tp.from=to,tp.to=from,tp.cap=0,tp.flow=0; edges.push_back(tp); int g_size=edges.size(); G[from].push_back(g_size-2); G[to].push_back(g_size-1); } bool BFS() { memset(vis,0,sizeof(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; } } if(!flow) d[x] = -1; return flow; } int Maxflow(int st,int ed) { int flow=0; while(BFS()) { memset(cur,0,sizeof(cur)); flow+=DFS(st,inf); } return flow; } void dfs(int u) { vis[u]=1; for(int i=0;i<G[u].size();i++) { int v=edges[G[u][i]].to; if(vis[v]==0&&edges[G[u][i]].cap-edges[G[u][i]].flow>0) dfs(v); } } int main() { int n,m,u,v,c;; while(~scanf("%d%d",&n,&m)) { edges.clear(); for(int i=0; i<N; i++) G[i].clear(); s=0;t=2*n+1; for(int i=1;i<=n;i++) { scanf("%d",&c); AddEdge(i+n,t,c); fa[i]=-c; } for(int i=1;i<=n;i++) { scanf("%d",&c); AddEdge(s,i,c); } for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); AddEdge(u,v+n,inf); } printf("%d\n",Maxflow(s,t)); queue<node>qt; node tp; memset(vis,0,sizeof(vis)); dfs(0); for(int i=1;i<=n;i++) { if(vis[i]==0) { tp.num=i; tp.st=1; qt.push(tp); } if(vis[i+n]) { tp.num=i; tp.st=0; qt.push(tp); } } printf("%d\n",qt.size()); while(!qt.empty()) { tp=qt.front(); if(tp.st==1) printf("%d -\n",tp.num); else printf("%d +\n",tp.num); qt.pop(); } } return 0; }
相关文章推荐
- jsp下载文件的实现方法
- hdu 1728 逃离迷宫
- 使用 Override 和 New 关键字进行版本控制
- Apache的prefork模式和worker模式
- POJ 3253 Fence Repair(贪心—霍夫曼树or优先队列)
- JS中的“!!”
- 给任务排序(Ordering Tasks,UVa 10305)
- struts form表单提交action处理之后没有跳转页面
- struts form表单提交action处理之后没有跳转页面
- Spark学习--spark-shell使用
- Swift_UILabel
- 编译vs2010 工程出unresolved external symbol __ultod3
- struts form表单提交action处理之后没有跳转页面
- Workspace in use or cannot be created, choose a different one.--错误解决办法
- 虚拟机中为何使用scsi_id无法查到磁盘的unid
- hdoj1269迷宫城堡【scc】
- 20151118 Set集合+HashSet类+TreeSet类
- zoj2913 Bus Pass BFS
- CocoaPosd详解
- Android Studio快捷键1、查看——2、查找——3、修改