POJ 3469(Dual Core CPU-最小割)[Template:網絡流dinic V2]
來源:程序員人生 發布時間:2014-11-03 08:47:38 閱讀次數:3045次
Language:
Default
Dual Core CPU
Time Limit: 15000MS
Memory Limit: 131072K
Total Submissions: 19321
Accepted: 8372
Case Time Limit: 5000MS
Description
As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Corporation, decided to update their famous product - SWODNIW.
The routine consists of N modules, and each of them should run in a certain core. The costs for all the routines to execute on two cores has been estimated. Let's define them as Ai and Bi . Meanwhile, M pairs
of modules need to do some data-exchange. If they are running on the same core, then the cost of this action can be ignored. Otherwise, some extra cost are needed. You should arrange wisely to minimize the total cost.
Input
There are two integers in the first line of input data, N and M (1 ≤ N ≤ 20000, 1 ≤ M ≤ 200000) .
The next N lines, each contains two integer, Ai and Bi .
In the following M lines, each contains three integers: a , b , w . The meaning is that if module a and module b don't execute on the same core, you should pay extra w dollars for the data-exchange
between them.
Output
Output only one integer, the minimum total cost.
Sample Input
3 1
1 10
2 10
10 3
2 3 1000
Sample Output
13
Source
POJ Monthly-⑵007.11.25, Zhou Dong
最小割的模板,其實就是最大流
注意:
Verson 2:
1.修復Bug,在本次模板中修改了q隊列的長度,
題目,裸最小割,
設S為用模塊A的集合,T為模塊B
則
s->任務i //模塊B的cost
任務i->t //模塊A的cost
任務i->任務j //(i,j)不在1個集合的cost,注意最小割,要2個方向(最小割只保證s->t沒路徑,t->s的路徑不用割)
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXn (20000+10)
#define MAXm (200000+10)
#define MAXN (MAXn+2)
#define MAXM ((MAXn*2+MAXm*2)*2+100)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
class Max_flow //dinic+當前弧優化
{
public:
int n,s,t;
int q[MAXN];
int edge[MAXM],next[MAXM],pre[MAXN],weight[MAXM],size;
void addedge(int u,int v,int w)
{
edge[++size]=v;
weight[size]=w;
next[size]=pre[u];
pre[u]=size;
}
void addedge2(int u,int v,int w){addedge(u,v,w),addedge(v,u,0);}
bool b[MAXN];
int d[MAXN];
bool SPFA(int s,int t)
{
For(i,n) d[i]=INF;
MEM(b)
d[q[1]=s]=0;b[s]=1;
int head=1,tail=1;
while (head<=tail)
{
int now=q[head++];
Forp(now)
{
int &v=edge[p];
if (weight[p]&&!b[v])
{
d[v]=d[now]+1;
b[v]=1,q[++tail]=v;
}
}
}
return b[t];
}
int iter[MAXN];
int dfs(int x,int f)
{
if (x==t) return f;
Forpiter(x)
{
int v=edge[p];
if (weight[p]&&d[x]<d[v])
{
int nowflow=dfs(v,min(weight[p],f));
if (nowflow)
{
weight[p]-=nowflow;
weight[p^1]+=nowflow;
return nowflow;
}
}
}
return 0;
}
int max_flow(int s,int t)
{
int flow=0;
while(SPFA(s,t))
{
For(i,n) iter[i]=pre[i];
int f;
while (f=dfs(s,INF))
flow+=f;
}
return flow;
}
void mem(int n,int s,int t)
{
(*this).n=n;
(*this).t=t;
(*this).s=s;
size=1;
MEM(pre)
}
}S;
int n,m;
int main()
{
// freopen("poj3469.in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&n,&m);
int s=1,t=n+2;
S.mem(n+2,s,t);
For(i,n)
{
int ai,bi;
scanf("%d%d",&ai,&bi);
S.addedge2(i+1,t,ai);
S.addedge2(s,i+1,bi);
}
For(i,m)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
S.addedge(a+1,b+1,w);
S.addedge(b+1,a+1,w);
}
cout<<S.max_flow(s,t)<<endl;
return 0;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈