日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[TJOI2015]线性代数(最小割)

發布時間:2024/4/15 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [TJOI2015]线性代数(最小割) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

給出一個N*N的矩陣B和一個1*N的矩陣C。求出一個1*N的01矩陣A.使得

D=(A*B-C)*A^T最大。其中A^T為A的轉置。輸出D 題解 觀察上面那個式子發現,當一個bij有貢獻時當且僅當a[i]=1&&a[j]=1。 且當a[i]=1時會產生-c[i]的貢獻。 然后我naive的以為這是個二元關系最小割。 其實沒那么復雜,我們建立源點向矩陣中的每一個元素連b[i][j]的邊,然后每個元素向t連c[i]的邊。 然后(i,j)ij分別連inf的邊。 這樣割左邊相當于ij至少有一個不選,割右邊相當于全選。 代碼 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define N 502 #define M 260020 #define inf 2e9 using namespace std; typedef long long ll; queue<int>q; typedef long long ll; int head[M],deep[M],cur[M],tot=1,n,c[N],b[N][N],top; ll sum,ans; inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x; } struct edge{int n,to,l;}e[N*N*7]; inline void add(int u,int v,int l){e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].l=l;e[++tot].n=head[v];e[tot].to=u;head[v]=tot;e[tot].l=0; } inline bool bfs(int s,int t){memset(deep,0,sizeof(deep));memcpy(cur,head,sizeof(cur));q.push(s);deep[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=e[i].n){int v=e[i].to;if(!deep[v]&&e[i].l){deep[v]=deep[u]+1;q.push(v);}}}return deep[t]; } ll dfs(int u,int t,int l){if(u==t||!l)return l;ll flow=0,f;for(int &i=cur[u];i;i=e[i].n){int v=e[i].to;if(deep[v]==deep[u]+1&&(f=dfs(v,t,min(l,e[i].l)))){e[i].l-=f;e[i^1].l+=f;flow+=f;l-=f;if(!l)break;}}return flow; } int main(){n=rd();int s=0,t=n*n+n+1;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){b[i][j]=rd(),sum+=b[i][j];++top,add(0,top,b[i][j]);add(top,n*n+i,inf);add(top,n*n+j,inf);} for(int i=1;i<=n;++i)c[i]=rd(),add(n*n+i,t,c[i]);while(bfs(s,t))ans+=dfs(s,t,inf);cout<<sum-ans;return 0; }

轉載于:https://www.cnblogs.com/ZH-comld/p/10258850.html

總結

以上是生活随笔為你收集整理的[TJOI2015]线性代数(最小割)的全部內容,希望文章能夠幫你解決所遇到的問題。

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