POJ 1459 Power Network
2021-06-06 04:05
阅读:696
题意:有n个据点,np个发电机。nc个用户,m条电线。给出发电机。用户。电线的电流限制,求最大网络电流。
这是带节点的网络流。事实上和原来没什么差别,仅仅要在前后都添加一个据点,在这里我加了0和n+1两个节点,而发电机节点的电流限制能够
转化为0->节点的电流限制,用户节点电流的限制能够转化为节点->n+1的电流限制,之后套用最大网络流模板就可以。这里我写了,Edmonds_karp算法。
稍后传上Dinic算法。。。
。
。
。。。。。。。。。。。。。
。。
AC代码例如以下:
Edmonds_karp算法
#include#include #include #include #define min(a,b) (a q; int a,b; for(i=0;i0) { f[i]=min(map[b][i],f[b]); p[i]=b; q.push(i); } } } if(p[e]==-1) return -1; else return f[e]; } int maxflow(int s,int e) { int i,j; int a,ans=0; a=Edmonds_karp(s,e); while(a!=-1) { int k=e,min=inf; while(k!=s) { map[p[k]][k]-=a; map[k][p[k]]+=a; k=p[k]; } ans+=a; a=Edmonds_karp(s,e); } return ans; } int main() { int i,j; int a,b,c,d,f; char z,x,y; while(cin>>n>>np>>nc>>m) { memset(map,0,sizeof map); for(i=1;i>z>>a>>x>>b>>y>>c; map[a+1][b+1]+=c; } for(i=1;i>z>>d>>x>>f; map[0][d+1]+=f; } for(i=1;i>z>>d>>x>>f; map[d+1][n+1]+=f; } cout Dinic算法
#include#include #include #include #define inf 100000000 #define min(a,b) (a q; int a,b; memset(cs,-1,sizeof cs); cs[0]=0; q.push(0); while(!q.empty()) { b=q.front (); q.pop(); for(i=0;i0) { cs[i]=cs[b]+1; q.push(i); } } } if(cs[n+1]==-1) return 0; else return 1; } int dfs(int s,int mf) { int i,j; int a,b; if(s==n+1) return mf; for(i=0;i0&&(a=dfs(i,min(mf,map[s][i])))) { map[s][i]-=a; map[i][s]+=a; return a; } } return 0; } int main() { int i,j; int a,b,c,d,f; while(cin>>n>>np>>nc>>m) { memset(map,0,sizeof map); for(i=1;i
上一篇:踩坑 net core
下一篇:C# 获得目录创建时间的源码片段
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:POJ 1459 Power Network
文章链接:http://soscw.com/index.php/essay/91119.html
文章标题:POJ 1459 Power Network
文章链接:http://soscw.com/index.php/essay/91119.html
评论
亲,登录后才可以留言!