Test instructions
There are n modules running on a and B-core dual-core computer, each module is known for running time on a A, a, a, and M triples (A,B,W), indicating that A and B modules are not running on a core to generate the additional cost of W, the total minimum costs.
Analysis:
That is, the N modules are divided into two sets, which can be solved by the method of minimum cut.
Code:
POJ 3469//sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std;
const int maxn=20020;
const int maxm=500020; struct Edge {int v,f,nxt;}
E[MAXM*2+10];
Queue<int> que;
int src,sink;
int g[maxn+10];
int nume;
BOOL VIS[MAXN+10];
int dist[maxn+10];
int n,m;
int A[MAXN],B[MAXN];
int A[MAXM],B[MAXM],W[MAXM];
void Addedge (int u,int v,int c) {e[++nume].v=v;e[nume].f=c;e[nume].nxt=g[u];g[u]=nume;
E[++nume].v=u;e[nume].f=0;e[nume].nxt=g[v];g[v]=nume;
} void Init () {memset (g,0,sizeof (g));
nume=1;
} int BFs () {while (!que.empty ()) Que.pop ();
memset (dist,0,sizeof (Dist));
memset (vis,0,sizeof (VIS));
Vis[src]=true;
Que.push (SRC);
while (!que.empty ()) {int U=que.front (); Que.pop ();
for (int i=g[u];i;i=e[i].nxt) if (e[i].f&&!vis[e[i].v]) {Que.push (E[I].V);
dist[e[i].v]=dist[u]+1;
Vis[e[i].v]=true;
if (E[i].v==sink) return 1;
}} return 0; } int dfs (int u,int delta) {if (U==sink) returnDelta
int ret=0; for (int i=g[u];ret<delta&&i;i=e[i].nxt) if (e[i].f&&dist[e[i].v]==dist[u]+1) {int Dd=dfs (E[I].V,
Min (E[i].f,delta-ret));
if (dd>0) {e[i].f-=dd;
E[I^1].F+=DD;
RET+=DD;
} else Dist[e[i].v]=-1;
} return ret;
} int dinic () {int ret=0;
while (BFS () ==1) Ret+=dfs (Src,int_max);
return ret;
} int main () {scanf ("%d%d", &n,&m);
int i,j;
for (I=0;i<n;++i) scanf ("%d%d", &a[i],&b[i]);
for (I=0;i<m;++i) scanf ("%d%d%d", &a[i],&b[i],&w[i]);
src=n,sink=n+1;
Init ();
for (i=0;i<n;++i) {Addedge (i,sink,a[i]);
Addedge (Src,i,b[i]);
} for (I=0;i<m;++i) {Addedge (a[i]-1,b[i]-1,w[i]);
Addedge (B[i]-1,a[i]-1,w[i]);
} printf ("%d", Dinic ());
return 0; }