日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 3511 土地划分

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3511 土地划分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3511

?

題目分析:

  看上去和前面的人員雇傭以及小M種田都很像。

  最小割模型來求最大值,一般都是考慮怎樣構圖使得滿足一個組合能被表示出來,而且當滿足一個組合的時候,能產生或失去所需的效益。[割掉的是不要的]

  我們將s與1相連,連為INF,這樣就不會被割,n向t連邊,同理。

  因為1和n會有邊連接,所以我們才多建出了節點s,t。

  然后對于每個點i,s向i連wa[i],i向t連wb[i],這樣就滿足了第一條性質。

  對于ea,eb,ec的弄法,我們就先從s向u和向v連ea/2,從u和v向t連eb/2,然后在uv之間連一條雙向的ea/2+eb/2+ec的邊。

  這樣連邊就能滿足第二條性質了,反正就是腦補一下各種割法,就發現它奧妙重重,十分正確。

  然后可以縮一下邊,把s->i的邊集以及i->t的合并一下[優化一下常數]。

?

#include<cstdio> #include<cstring> #include<algorithm>using namespace std;const int maxn=10010; const int maxm=40010; const int INF=0x3f3f3f3f;struct Node{int data,next,low; }node[maxm*2+maxn*4];#define now node[point].data #define www node[point].low #define then node[point].nextint n,m,cnt; int s,t,ans; int wa[maxn],wb[maxn]; int stoi[maxn],itot[maxn]; int cur[maxn],head[maxn]; int dis[maxn],que[maxn];void add(int u,int v,int w){node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;head[u]=cnt++;node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=0;head[v]=cnt++; }void add2(int u,int v,int w){node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;head[u]=cnt++;node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=w;head[v]=cnt++; }bool BFS(){memset(dis,-1,sizeof(dis));int H=0,T=1;que[1]=s;dis[s]=0;while(H<T){H++;for(int point=head[que[H]];point!=-1;point=then)if(www && dis[now]<0){dis[now]=dis[que[H]]+1;que[++T]=now;}}return dis[t]>0; }int dfs(int x,int low){if(x==t) return low;int Low;for(int &point=cur[x];point!=-1;point=then)if(www && dis[now]==dis[x]+1){Low=dfs(now,min(low,www));if(Low){www-=Low,node[point^1].low+=Low;return Low;}}return 0; }int main(){ #ifndef ONLINE_JUDGEfreopen("3511.in","r",stdin);freopen("3511.out","w",stdout); #endifint u,v,Ea,Eb,Ec;scanf("%d%d",&n,&m);t=n+1;for(int i=s;i<=t;i++) head[i]=-1;for(int i=2;i<n;i++) scanf("%d",&wa[i]),stoi[i]+=(wa[i]<<1);for(int i=2;i<n;i++) scanf("%d",&wb[i]),itot[i]+=(wb[i]<<1);for(int i=1;i<=m;i++){scanf("%d%d%d%d%d",&u,&v,&Ea,&Eb,&Ec);add2(u,v,Ea+Eb+(Ec<<1));stoi[u]+=Ea,stoi[v]+=Ea;itot[u]+=Eb,itot[v]+=Eb;}for(int i=1;i<=n;i++)ans+=stoi[i]+itot[i];stoi[1]=itot[n]=INF;for(int i=1;i<=n;i++)add(s,i,stoi[i]),add(i,t,itot[i]);int flag;while(BFS()){memcpy(cur,head,sizeof(head));while(flag=dfs(s,INF))ans-=flag;}ans>>=1;printf("%d",ans);return 0; } View Code

?

轉載于:https://www.cnblogs.com/Robert-Yuan/p/5223274.html

總結

以上是生活随笔為你收集整理的BZOJ 3511 土地划分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。