POJ3469,最大流,最小割
阿新 • • 發佈:2018-12-13
題目連結:Dual Core CPU 題意是:每個點有兩個選擇,要麼選擇A,要麼選擇B,選擇A和選擇B有相應的時長,但是二者不能同時選。 最小割就是,求最小的代價,使得源點和匯點不在聯通,也就是這道題中的不能同時選擇。 建圖: 1.源點為A,匯點為B,由A向點i連邊,點i向B連邊。 2.對於有特殊關係的兩個點,相互連邊 程式碼如下:
/************************************************************************* > File Name: main.cpp > Author:Eagles > Mail:None > Created Time: 2018年10月05日 星期五 18時39分38秒 > Description:POJ3469 ************************************************************************/ #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; #define N 200000 struct node { int to; int val; int nex; }E[N*5]; int head[N],lev[N]; int n,m,cnt; int S,T; void addEdge_1(int a, int b, int val) { E[cnt].to=b; E[cnt].val=val; E[cnt].nex=head[a]; head[a]=cnt++; E[cnt].to=a; E[cnt].val=0; E[cnt].nex=head[b]; head[b]=cnt++; } void addEdge_2(int a, int b, int val) { E[cnt].to=b; E[cnt].val=val; E[cnt].nex=head[a]; head[a]=cnt++; E[cnt].to=a; E[cnt].val=val; E[cnt].nex=head[b]; head[b]=cnt++; } bool bfs() { queue<int>q; memset(lev,0,sizeof(lev)); lev[S]=1; q.push(S); while (!q.empty()) { int u=q.front(); q.pop(); for (int i=head[u]; i!=-1; i=E[i].nex) { int v=E[i].to; if (E[i].val>0&&lev[v]==0) { lev[v]=lev[u]+1; q.push(v); if (v==T) return true; } } } return false; } int dfs(int u, int f) { if (u == T) return f; int tag=0; for (int i=head[u]; i!=-1; i=E[i].nex) { int v=E[i].to; if (E[i].val>0&&lev[v]==lev[u]+1) { int d=dfs(v,min(f-tag,E[i].val)); E[i].val-=d; E[i^1].val+=d; tag+=d; if (tag==f) return f; } } return tag; } int Dinic() { int ans=0; int inf=1000000; while (bfs()) { ans+=dfs(S,inf); } return ans; } void init() { memset(head,-1,sizeof(head)); cnt=0; S=0; T=n+1; for (int i=1; i<=n; i++) { int a,b; scanf("%d%d",&a,&b); addEdge_1(S,i,a); addEdge_1(i,T,b); } while (m--) { int a,b,val; scanf("%d%d%d",&a,&b,&val); addEdge_2(a,b,val); } } int main() { while (~scanf("%d%d",&n,&m)) { init(); printf("%d\n",Dinic()); } return 0; }