最大流最小割(静态链表)——poj3469

摘要:
id=3469网络流的模型:每个模块一个节点,原点与所有模块节点连接,边权为第一个核对应该模块的开销。然后需要数据交换的两个模块结点之间连接双向边,权为对应的那个额外开销。=EOF){inti;graph.init;for{scanf;graph.add;graph.add;}for{scanf;graph.add;graph.add;}printf;}return0;}ps:别人写的网络流类,很不错

http://poj.org/problem?id=3469

网络流的模型:
最大流最小割(静态链表)——poj3469第1张每个模块一个节点,原点与所有模块节点连接(称为上边),边权为第一个核对应该模块的开销。
最大流最小割(静态链表)——poj3469第1张所有模块节点连接到汇点(称为下边),权为第二个核对应该模块的开销。
最大流最小割(静态链表)——poj3469第1张然后需要数据交换的两个模块结点之间连接双向边(两个单向边,称为中边),权为对应的那个额外开销。

最大流最小割(静态链表)——poj3469第4张最大流最小割(静态链表)——poj3469第5张View Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 20000;
const int INF = 1000000000;
int min(int a,int b)
{
if(a<b)return a;
return b;
}
struct Edge
{
int v,cap;
Edge *next,*pair;
}edge[MAXN*22*2+10];
struct Graph
{
Edge *G[MAXN+10],*cur[MAXN+10],*pE;
int dist[MAXN+10],num[MAXN+10];
int n,s,t;
void init(int nn,int ss,int tt)
{
n=nn;
s=ss,t=tt;
memset(G,0,sizeof(G));
pE=edge;
}
void add(int u,int v,int cap,Edge *pair)
{
pE->v=v;
pE->cap=cap;
pE->next=G[u];
pE->pair=pair;
G[u]=pE++;
}
void add(int u,int v,int cap)
{
add(u,v,cap,pE+1);
add(v,u,0,pE-1);
}
int aug(int u,int preCap)
{
if(u==t)return preCap;
int leftCap=preCap;
for(Edge *&it=cur[u];it;it=it->next)
{
if(it->cap&&dist[it->v]+1==dist[u])
{
int d=aug(it->v,min(leftCap,it->cap));
it->cap-=d;
it->pair->cap+=d;
leftCap-=d;
if(leftCap==0||dist[s]==n)return preCap-leftCap;
}
}
int minDist=n;
for(Edge *it=cur[u]=G[u];it;it=it->next)
if(it->cap)minDist=min(minDist,dist[it->v]+1);//+1 if(--num[dist[u]]==0)dist[s]=n;
else num[dist[u]=minDist]++;
return preCap-leftCap;
}
int maxFlow()
{
memset(dist,0,sizeof(dist));
memset(num,0,sizeof(num));
memmove(cur,G,sizeof(G));
num[0]=n;
int flow=0;
while(dist[s]<n)flow+=aug(s,INF);
return flow;
}
}graph;
int main()
{
int n,m,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
graph.init(n+2,0,n+1);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
graph.add(0,i,a);
graph.add(i,n+1,b);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
graph.add(a,b,c);
graph.add(b,a,c);
}
printf("%d\n",graph.maxFlow());
}
return 0;
}

ps:别人写的网络流类,很不错

免责声明:文章转载自《最大流最小割(静态链表)——poj3469》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇openCV学习——一、图像读取、显示、输出使用 -命令行-给-python-安装whl文件,下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

PS如何把印章颜色加重更加清晰?

我的问题是加深这个印章上的红色,然后看起来更清晰,而不会影响最下面一行文字的颜色。步骤1:打开PS软件并创建新文档。白边的实际密封尺寸设置为5cm,分辨率设置为72像素/英寸。在本例中,图像更清晰;步骤2:在工具栏中选择椭圆工具。注意图中的红色圆圈2。确保选择图形层而不是路径。...

SQL获取当天0点和23点59分方法

SELECTconvert+'00:00:00'--是将当前的时间加上小时分秒组成字符型的时间。SELECTcast--是将字符转成日期型的数据并输出。...

移动端媒体查询的一些尺寸参考

device-width是设备实际的宽度,不会随着屏幕的旋转而改变,因此并不适合开发响应式网站。比如iphone5s的屏幕分辨率宽为640,由于retina显示策略,当scale设置为1的时候,对应的media中取到的width为320,当scale设置为0.5的时候,width为640,而device-width始终是320。总结1.device-widt...

Redis设置Auth认证保护

Redis有一种保护数据安全的身份验证方法。有两种方法可以设置此身份验证。一个是通过配置文件。另一种是直接在Redis客户端命令中设置参数requirepas。首先是在配置文件中查找参数requirepass。这是配置Redis访问密码的参数。由于Redis具有很强的并发能力,并且只使用密码,攻击者可能会在短时间内发送大量密码猜测请求,这很容易被暴力破解。因...

vant上传文件到后端

Html代码&lt;Ts代码文件列表=[]/image/[a-zA-z]+/。test(file.file.type)){this.$toast(“请上传图片”);returnfalse;config).then(res=&gt;})。捕获(()=&gt;拒绝)=&gt;ts=“+newDate().getTime()).然后...

Vue浏览器调试工具VueTools安装以及使用

ue-devtools是一款基于chrome浏览器的插件,用于vue应用的调试,这款vue调试神器可以极大地提高我们的调试效率。vue-devtools使用起来还是比较简单的,上手非常的容易,这里就细讲其使用说明了。安装方法二:这里以chrome浏览器为例:1、打开chrome网上应用店,搜索vue.js注:如果打不开页面需要代理选择第一个,点击添加至chr...