P4210 土地划分
【题意】
土地可以选A/B,对于土地之间的公路,同时选A有ea的额外贡献,同时选B有eb的额外贡献,不同则有ec的额外花费
【分析】
典型的二者选其一模型

仍然用这个图解出一组解即可
#include<bits/stdc++.h> using namespace std; #define mp make_pair #define fi first #define se second #define lson now<<1 #define rson now<<1|1 typedef long long ll; const int maxn=1e4+5; const int maxm=1e6+5; int n,m,a[maxn],b[maxn]; int S,T; const ll inf=1e17; int head[maxn],tot=1,cur[maxn]; struct edge { int to,nxt; ll v; }e[maxm<<1]; void add(int x,int y,ll z) { e[++tot].to=y; e[tot].nxt=head[x]; e[tot].v=z; head[x]=tot; e[++tot].to=x; e[tot].nxt=head[y]; e[tot].v=0; head[y]=tot; } int dep[maxn]; bool bfs() { for(int i=S;i<=T;i++) dep[i]=-1,cur[i]=head[i]; // memset(dep,-1,sizeof(dep)); // memcpy(cur,head,sizeof(cur)); queue <int> q; dep[S]=0; q.push(S); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=e[i].nxt) { int to=e[i].to; if(dep[to]!=-1 || !e[i].v) continue; q.push(to); dep[to]=dep[u]+1; } } return (dep[T]!=-1); } ll dfs(int u,ll flow) { if(u==T) return flow; ll res=0; for(int &i=cur[u];i;i=e[i].nxt) { int to=e[i].to; if(dep[to]!=dep[u]+1 || e[i].v<=0) continue; ll tmp=dfs(to,min(e[i].v,flow)); flow-=tmp; res+=tmp; e[i].v-=tmp; e[i^1].v+=tmp; if(!flow) break; } if(!res) dep[u]=-1; return res; } ll dinic() { ll ans=0; while(bfs()) { ans+=dfs(S,inf); } return ans; } int main() { scanf("%d%d",&n,&m); ll sum=0,x,y,a,b,c; S=0; T=n+1; for(int i=2;i<=n-1;i++) scanf("%lld",&x),sum+=x*2,add(S,i,x<<1); for(int i=2;i<=n-1;i++) scanf("%lld",&x),sum+=x*2,add(i,T,x<<1); add(S,1,inf); add(n,T,inf); for(int i=1;i<=m;i++) { scanf("%lld%lld%lld%lld%lld",&x,&y,&a,&b,&c); add(S,x,a); add(S,y,a); add(x,T,b); add(y,T,b); add(x,y,c*2+a+b); add(y,x,c*2+a+b); sum+=(a+b)*2; } printf("%lld",(sum-dinic())/2); return 0; }

【代码】

浙公网安备 33010602011771号