Andrew Stankevich Contest 10 I Trade 有下届网络流
2016-09-13 11:24
323 查看
用Dinic跑一遍,关键是建图
#include<bits/stdc++.h> #define MEM(a,x) memset(a,x,sizeof(a)); #define MEMINF(a) memset(a,0x3f,sizeof(a)); using namespace std; typedef long long LL; const int MAXN=1e6+10; const int INF=0x3f3f3f3f; const int MOD=1000000007; struct Edge{ int to,nex,cap,id; }edge[MAXN]; int top; int head[MAXN],gap[MAXN],point[MAXN]; void Addedges(int u,int v,int cap,int id) { edge[top].id=id; edge[top].cap=cap; edge[top].to=v; edge[top].nex=head[u]; head[u]=top++; } void Addedge(int u,int v,int cap,int id) { Addedges(u,v,cap,id); Addedges(v,u,0,id); } int bfs(int s,int t) { MEM(gap,-1); queue<int>q; gap[s]=0; q.push(s); while (!q.empty()) { int u=q.front(); q.pop(); for (int i=head[u]; ~i; i=edge[i].nex) { int v=edge[i].to,cap=edge[i].cap; if (cap>0&&gap[v]<0) { gap[v]=gap[u]+1; q.push(v); } } } return gap[t]; } int dfs(int s,int t,int flow) { int f; if (s==t) return flow; for (int i=head[s]; ~i; i=edge[i].nex) { if (edge[i].cap>0&&gap[s]<gap[edge[i].to]) if ((f=dfs(edge[i].to,t,min(flow,edge[i].cap)))>0) { edge[i].cap-=f; edge[i^1].cap+=f; return f; } } return 0; } int Dinic (int s,int t,int cntV) { int flow=0; int f; while(bfs(s,t)>=0) { while((f=dfs(s,t,INF))>0) flow+=f; } return flow; } int main() { freopen("trade.in","r",stdin); freopen("trade.out","w",stdout); int m,n,p; cin>>m>>n>>p; MEM(head,-1); top=0; int s=m+n,t=m+n+1; int cntS=m+n+2,cntT=m+n+3; int cntV=m+n+4; for (int i=1; i<=p; ++i) { int u,v; scanf("%d %d",&u,&v); Addedge(u-1,m+v-1,1,i); } for (int i=0; i<m; ++i) { Addedge(s,i,INF,0); Addedge(cntS,i,2,0); } for(int i=0; i<n; ++i) { Addedge(i+m,t,INF,0); Addedge(i+m,cntT,2,0); } Addedge(s,cntT,2*m,0); Addedge(cntS,t,2*n,0); int tflow=n*2+m*2; int tmp=Dinic(cntS,cntT,cntV); Addedge(t,s,INF,0); tmp+=Dinic(cntS,cntT,cntV); if (tmp!=tflow) { puts("-1"); return 0; } vector<int>ans; for (int i=0; i<m; ++i) { for (int u=head[i]; ~u; u=edge[u].nex) { if (edge[u].cap==0&&(edge[u].to>=m&&edge[u].to<n+m)) ans.push_back(edge[u].id); } } printf("%d\n",(int) ans.size()); sort(ans.begin(),ans.end()); printf("%d ",ans[0]); for (int i=1; i<ans.size(); ++i) printf("%d%c",ans[i]," \n"[i==ans.size()-1]); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解