poj 1637 Sightseeing tour 混和欧拉图 dinic
2015-08-13 19:20
447 查看
#pragma comment(linker, "/STACK:102400000,102400000") #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; }; vector<Edge>edges; vector<int>G ; int n,m,s,t; int vis ; int d ; int cur ; 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; } } return flow; } int Maxflow(int st,int ed) { int flow=0; while(BFS()) { memset(cur,0,sizeof(cur)); flow+=DFS(st,inf); } return flow; } int main() { int i,j,_,u,v,c,flow,f,mp ,in ,out ; scanf("%d",&_); while(_--) { scanf("%d%d",&n,&s); memset(mp,0,sizeof(mp)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); edges.clear(); for(i=0;i<N;i++) G[i].clear(); for(i=0;i<s;i++) { scanf("%d%d%d",&u,&v,&c); if(c==0) mp[u][v]++; out[u]++; in[v]++; } f=1; s=0; t=n+1; for(i=1,flow=0;i<=n;i++) { int tp=in[i]-out[i]; if(tp>0) flow+=tp/2; else tp=-tp; if(tp%2==1) {f=0;break;} } if(f==0) {printf("impossible\n");continue;} for(i=1;i<=n;i++) { if(in[i]>out[i]) AddEdge(s,i,(in[i]-out[i])/2); else AddEdge(i,t,(out[i]-in[i])/2); for(j=1;j<=n;j++) if(mp[i][j]) AddEdge(j,i,mp[i][j]); } if(Maxflow(s,t)==flow) printf("possible\n"); else printf("impossible\n"); } return 0; }
相关文章推荐
- Redis学习(2)-数据类型String和Hashes
- 超链接收集
- 如何解决秒杀的性能问题和超卖的讨论
- python爬虫
- Oracle查询结果输出问题
- cocos3.x导出自定义类到Lua以及手动绑定要回调的函数
- 简析Android mediaPlayer 播放在线音乐网络异常状态的处理
- Linux下Android studio 创建项目build错误
- HDU 3117 Fibonacci Numbers
- POJ 3026 Borg Maze
- RelativeLayout用到的一些重要的属性:
- Java学习之路0813(HttpClient中的doGet和doPost实例)
- C++ 友元(共享数据)
- MVP模式解读与实战运用(二)
- Cocos2d-x 2.3.3版本 FlappyBird
- nginx 限制
- Clone Graph
- python读取properties配置文件
- 苹果IOS开发者账号总结
- 精通Hibernate——Hibernate中Java对象的状态详解