网站开发Z亿玛酷1订制,最后的目的是什么,seo网络推广哪家专业,建设银行官方网站企业网银考虑使非剪刀石头布情况尽量少。设第i个人赢了xi场#xff0c;那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种。那么使Σxi(xi-1)/2尽量小即可。 考虑网络流。将比赛建成一排点#xff0c;人建成一排点#xff0c;每场未确定比赛向比赛双方连边#xff0c;确定比赛向赢… 考虑使非剪刀石头布情况尽量少。设第i个人赢了xi场那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种。那么使Σxi(xi-1)/2尽量小即可。 考虑网络流。将比赛建成一排点人建成一排点每场未确定比赛向比赛双方连边确定比赛向赢者连边这样就是一种合法的比赛方案了。 在此基础上控制代价最小。由于每多赢一场非剪刀石头布情况的增量就更大将边拆开费用设为增量即可。 #includeiostream
#includecstdio
#includecmath
#includecstdlib
#includecstring
#includealgorithm
using namespace std;
int read()
{int x0,f1;char cgetchar();while (c0||c9) {if (c-) f-1;cgetchar();}while (c0c9) x(x1)(x3)(c^48),cgetchar();return x*f;
}
#define N 110
#define S 0
#define T 10101
int n,p[N*N],l[N*N],r[N*N],cnt,t-1,ans,a[N][N];
int d[N*N],q[N*N],pre[N*N];
bool flag[N*N];
struct data{int to,nxt,cap,flow,cost;
}edge[N*N4];
void addedge(int x,int y,int z,int cost)
{t;edge[t].toy,edge[t].nxtp[x],edge[t].capz,edge[t].flow0,edge[t].costcost,p[x]t;t;edge[t].tox,edge[t].nxtp[y],edge[t].cap0,edge[t].flow0,edge[t].cost-cost,p[y]t;
}
int inc(int x){x;if (xT) x-T;return x;}
bool spfa()
{memset(d,42,sizeof(d));d[S]0;memset(flag,0,sizeof(flag));int head0,tail1;q[1]S;do{int xq[inc(head)];flag[x]0;for (int ip[x];~i;iedge[i].nxt)if (d[x]edge[i].costd[edge[i].to]edge[i].flowedge[i].cap){d[edge[i].to]d[x]edge[i].cost;pre[edge[i].to]i;if (!flag[edge[i].to]) q[inc(tail)]edge[i].to,flag[edge[i].to]1;}}while (head!tail);return d[T]10000000;
}
void ekspfa()
{while (spfa()){int v1;for (int iT;i!S;iedge[pre[i]^1].to)if (edge[pre[i]].flowedge[pre[i]].cap) {v0;break;}if (v)for (int iT;i!S;iedge[pre[i]^1].to)ans-edge[pre[i]].cost,edge[pre[i]].flow,edge[pre[i]^1].flow--;}
}
int main()
{
#ifndef ONLINE_JUDGEfreopen(bzoj2597.in,r,stdin);freopen(bzoj2597.out,w,stdout);const char LL[]%I64d\n;
#elseconst char LL[]%lld\n;
#endifcntnread();memset(p,255,sizeof(p));for (int i1;in;i)for (int j1;jn;j){int xread();if (ij){cnt;l[cnt]i,r[cnt]j;addedge(S,cnt,1,0);if (x0) addedge(cnt,j,1,0);else if (x1) addedge(cnt,i,1,0);else addedge(cnt,i,1,0),addedge(cnt,j,1,0);}}for (int i1;in;i)for (int j1;jn;j)addedge(i,T,1,j-1);ansn*(n-1)*(n-2)/6;ekspfa();coutansendl;for (int in1;icnt;i)for (int jp[i];~j;jedge[j].nxt)if (edge[j].flow0) if (edge[j].tol[i]) a[l[i]][r[i]]1;else a[r[i]][l[i]]1;for (int i1;in;i){for (int j1;jn;j)printf(%d ,a[i][j]);printf(\n);}return 0;
} 转载于:https://www.cnblogs.com/Gloid/p/9595597.html