您的位置:首页 > 理论基础 > 计算机网络

POJ 3469 Dual Core CPU 网络流(坑爹)

2011-08-17 08:42 323 查看
//这个题目巨坑爹啊。。那个数组的大小实在让我蛋疼。。这个题目就是
//建图还算好建的,,但是那个数组就要发挥你的想象力了。。我从440000,
////开始试,试了N次,,到最后都快崩溃了,,其间我一直相信我的程序没有写错。
//最后没办法了。。只能百度。。发现百度上的居然开了1000000,这让无比的蛋疼
//去试了下,,居然AC。。再感叹下,,这个坑爹的题目、、、
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 990000
#define M 990000 //这个要够大。。//
#define inf 999999999
using namespace std;

int n,m,s,t,num,adj
,dis
,q
;
int min(int g,int h)
{
if(g>h)
return h;
else
return g;
}
struct edge
{
int v,w,pre;
}e[M];
void insert(int u,int v,int w)

{
e[num].v=v;
e[num].w=w;
e[num].pre=adj[u];
adj[u]=num++;
e[num].v=u;
e[num].w=0;
e[num].pre=adj[v];
adj[v]=num++;

}
int bfs()
{
int i,x,v,tail=0,head=0;
memset(dis,0,sizeof(dis));
dis[s]=1;
q[tail++]=s;
while(head<tail)
{
x=q[head++];
for(i=adj[x];i!=-1;i=e[i].pre)
if(e[i].w&&dis[v=e[i].v]==0)
{
dis[v]=dis[x]+1;
if(v==t)
return 1;
q[tail++]=v;
}
}
return 0;
}
int dfs(int s,int limit)
{
if(s==t)
return limit;
int i,v,tmp,cost=0;
for(i=adj[s];i!=-1;i=e[i].pre)
if(e[i].w&&dis[s]==dis[v=e[i].v]-1)
{
tmp=dfs(v,min(limit-cost,e[i].w));
if(tmp>0)
{
e[i].w-=tmp;
e[i^1].w+=tmp;
cost+=tmp;
if(limit==cost)
break;
}
else dis[v]=-1;
}
return cost;
}
int Dinic()
{
int ans=0;
while(bfs())
ans+=dfs(s,inf);
return ans;
}

int main ()
{
int i,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
int u,v,w;
memset(adj,-1,sizeof(adj));
num=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
insert(0,i,a);
insert(i,n+1,b);
}
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
insert(v,u,w);
}
s=0;
t=n+1;
printf("%d\n",Dinic());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: