2017.9.8 线性代数 失败总结

来源:互联网 发布:java 1.8.0 openjdk 编辑:程序博客网 时间:2024/05/25 18:10

网络流做的太少、理解又不深刻、、所以关系求出来也会挂

这个标题和内容唯一有关的就是 矩阵乘法的运算法则、、

-然后就设a1、a2、a3、b1,1、b1,2、……然后带到给的式子里、发现:



然后发现a1==1 有一些贡献、a1和a2==1有贡献、a1和a3==1有贡献……


然后就用最小割来划分0 、 1


这是最大权闭合子图问题、、同时选就相当于他们必须在一个集合,要用正无穷表示不会被割

然后对于每一个点,要么割它左边,要么割它右边、 就可以用流量表示(那边损失小割哪边)

理解建图、最小割的意义就好了(当然需要自己感受)

%ISA  网络流大师,婊题解好劲啊



码(开了2倍空间才过、不知为何):

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;#define N 600005#define inf 1000000009queue<int>q;int tot=-1,cnt,hou[N<<1],n,s,t,v[N<<1],sum,zhong[N<<1],yuan[N<<1],xia[N],c[N],a[N],b[2005][2005],d[N];void jian(int a,int b,int c){++tot,v[tot]=c;hou[tot]=yuan[a],zhong[tot]=b,yuan[a]=tot;}void jia(int a,int b,int c){jian(a,b,c);jian(b,a,0);}bool bfs(int s,int t){int i;memset(d,0x7f,sizeof(d));for(i=1;i<=n*n+3;i++){xia[i]=yuan[i];}d[s]=1;q.push(s);while(!q.empty()){int st=q.front();q.pop();for(i=xia[st];i!=-1;i=hou[i]){int nd=zhong[i];if(v[i]<=0)continue;if(d[nd]>inf){d[nd]=d[st]+1;    q.push(nd);}}}return d[t]<inf;}int dfs(int o,int t,int limit){if(o==t||!limit)return limit;int i,f=0,flow=0;for(i=xia[o];i!=-1;i=hou[i]){xia[o]=i;int nd=zhong[i];if(d[nd]==d[o]+1&&(f=dfs(nd,t,min(v[i],limit)))){flow+=f;limit-=f;v[i]-=f;v[i^1]+=f;if(!limit)break;    }}return flow;}int dinic(int s,int t){int ans=0;while(bfs(s,t)){ans+=dfs(s,t,inf);}return ans;}int main(){int i,j;memset(yuan,-1,sizeof(yuan));scanf("%d",&n);cnt=n;for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&b[i][j]);sum+=b[i][j];}s=n*n+1;t=n*n+2;for(i=1;i<=n;i++)scanf("%d",&c[i]);for(i=1;i<=n;i++)  //建自己的边 {jia(s,i,c[i]);//cout<<yuan[s];//cout<<hou[tot-1]<<" "<<hou[hou[tot-1]]<<" "<<hou[hou[hou[tot-1]]]<<endl;jia(i,t,b[i][i]);}for(i=1;i<=n;i++)for(j=i+1;j<=n;j++){++cnt;if(i==j)continue;jia(i,cnt,inf);jia(j,cnt,inf);jia(cnt,t,b[i][j]+b[j][i]);}sum-=dinic(s,t);printf("%d",sum);}







原创粉丝点击