您的位置:首页 > 大数据 > 人工智能

2016 Multi-University Training Contest 4 T9

2016-07-29 16:07 453 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5772

最大权闭合子图。

得到价值w[i][j]的条件是选了i,j这两个位置的字符。选择位置的i字符花费为

第一次选s[i]:a[s[i]] 不是第一次选s[i]:b[s[i]]

所以对于选i位置字符前提为选了花费为b[s[i]]-a[s[i]]的字符i。

得到上面的关系图后然后就是普通的最大权闭合子图问题,直接求解即可。

#include<cstdio>
#include<cstring>
#define M 120010
#define N 6010
#define inf 1000000000
int len[M <<1],e[M <<1],nex[M <<1],other[M <<1],head
,last
,d
,num
;
int te,sum,_,j,num1,num2,w[110][110],a[11],b[11],m,n,i,ans,tot,ss,tt,ee,u,v,c;
char s[110];
int init()
{
memset(head,0,sizeof(head));
memset(num,0,sizeof(num));
memset(d,0,sizeof(d));
ans=ee=0;
}
int min(int a,int b)
{
return a<b?a:b;
}
void add(int u,int v,int c)
{
//printf("%d %d %d\n",u,v,c);
other[++ee]=ee+1;
e[ee]=v;nex[ee]=head[u];head[u]=ee;len[ee]=c;
other[++ee]=ee-1;
e[ee]=u;nex[ee]=head[v];head[v]=ee;len[ee]=0;
}
int dfs(int x,int flow)
{
int rec,j,p;
if (x==tt) return flow;
rec=0;j=last[x];
while (j!=0)
{
if (len[j]>0 && d[x]==d[e[j]]+1)
{
last[x]=j;
p=dfs(e[j],min(len[j],flow-rec));
len[j]-=p;len[other[j]]+=p;
rec+=p;
if (rec==flow) return rec;
}
j=nex[j];
}
if (d[ss]>tot) return rec;
if (--num[d[x]]==0) d[ss]=tot;
last[x]=head[x];
num[++d[x]]++;
return rec;
}
int main()
{
scanf("%d",&_);
while (_--)
{
sum=0;init();
scanf("%d",&n);
scanf("%s",s+1);
for (i=0;i<=9;i++)
scanf("%d%d",&a[i],&b[i]);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
scanf("%d",&w[i][j]);
num1=1;ss=1;
for (i=1;i<=n;i++)
for (j=i+1;j<=n;j++)
if (w[i][j]+w[j][i]!=0)
{
add(ss,++num1,w[i][j]+w[j][i]);
sum+=w[i][j]+w[j][i];
}
num2=1;tt=num1+n+11;
for (i=1;i<=n;i++)
for (j=i+1;j<=n;j++)
if (w[i][j]+w[j][i]!=0)
{
add(++num2,num1+i,inf);
add(num2,num1+j,inf);
}
for (i=1;i<=n;i++)
{
add(num1+i,num1+n+s[i]-'0'+1,inf);
add(num1+i,tt,a[s[i]-'0']);
}
for (i=0;i<=9;i++)
add(num1+n+i+1,tt,b[i]-a[i]);
tot=num[0]=tt;
for (i=ss;i<=tt;i++)
last[i]=head[i];
while (d[ss]<tot)
ans+=dfs(ss,2147483647);
printf("Case #%d: %d\n",++te,sum-ans);
}
return 0;

}


View Code
Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
178199712016-07-29 15:40:45Accepted577215MS2052K2416 BG++lbz007
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: