CodeForces 269C Flawed Flow 拓扑
2016-02-27 16:25
357 查看
题意:给出一张网络流构成的图,给出每对点之间的流量,要求输出流的方向。
思路:平衡出入流,入流=出流=流量>>1 以源点为突破口类似拓扑的方式写就好了。
思路:平衡出入流,入流=出流=流量>>1 以源点为突破口类似拓扑的方式写就好了。
//平衡出入流 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string.h> #include<algorithm> #include<stack> using namespace std; const int maxn=300000; const int maxm=600000; int n; struct node { int u,v,w,next,id; }edge[maxm]; int in[maxn],out[maxn]; int em; int head[maxn]; void addedge(int u,int v,int w,int _id) { edge[em].id=_id; edge[em].u=u; edge[em].v=v; edge[em].w=w; edge[em].next=head[u]; head[u]=em++; } stack<int>q; int dir[maxm]; int e1[maxn],e2[maxn]; void topo() { while(!q.empty()) q.pop(); q.push(1); in[1]=out[1]=0; while(!q.empty()) { int u=q.top(); q.pop(); for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].v; if(in[v]==out[v] && v!=n) continue; in[v]+=edge[i].w; // cout<<v<<" "<<in[v]<<" "<<out[v]<<endl; if(in[v]==out[v] && v!=n) q.push(v); int _id=edge[i].id; // cout<<v<<" "<<_id<<endl; if(v==e1[_id]) dir[_id]=1; } } } int tu,tv,tw; int main() { // freopen("in.txt","r",stdin); int m; while(scanf("%d%d",&n,&m)!=EOF) { em=0; memset(head,-1,sizeof(head)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(dir,0,sizeof(dir)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&tu,&tv,&tw); e1[i]=tu; e2[i]=tv; addedge(tu,tv,tw,i); addedge(tv,tu,tw,i); out[tu]+=tw; out[tv]+=tw; } for(int i=1;i<=n;i++) out[i]=out[i]>>1; out[1]=0; topo(); for(int i=1;i<=m;i++) { printf("%d\n",dir[i]); } } return 0; }
相关文章推荐
- Java中的线程的生命周期
- Java多线程Lock对象常用方法(3)
- 产品经理的灵魂所在
- SQLHelper.cs
- Nginx一个server主机上80、433http、https共存
- Debug的使用
- C++暂时对象
- 寻路开启(一)
- strace yii2 - 完整strace追踪
- css选择器
- C 程序的可移植性
- 《数据结构进行曲》 带头结点单循环链表的合并
- oracle中pl/sql程序高级类型的使用
- HDU 1022 火车进出站问题
- 编译原理学习(1)
- Android实战技巧:ViewStub的应用
- yii2 strace 追踪,本地文件
- 集训队专题(7)1003 Task Schedule
- 对象 接口 抽象类
- [Locked] Missing Ranges