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。
得到上面的关系图后然后就是普通的最大权闭合子图问题,直接求解即可。
View Code
最大权闭合子图。
得到价值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 ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
17819971 | 2016-07-29 15:40:45 | Accepted | 5772 | 15MS | 2052K | 2416 B | G++ | lbz007 |
相关文章推荐
- 线程间通信--wait和notify
- gtx com.google.android.xts.permissions.DefaultPermissionGrantPolicyTest -- testDefaultGrants fail
- 2016 Multi-University Training Contest 4 Another Meaning
- 2016 Multi-University Training Contest 4 1005Lucky7
- socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT
- main()与_tmain()的区别
- 大量TIME_WAIT的终极详解和解决方案
- zabbix报警媒介:email
- zabbix报警媒介:email
- ecshop网站加载waiting(TTFB)时间过长的加速方法
- 再谈应用环境下的TIME_WAIT和CLOSE_WAIT
- CRT+容斥定理——Luck7 ( HDU 5768 ) ( 2016 Multi-University Training Contest 4 1005 )
- HDU 5768 Lucky7(2016 Multi-University Training Contest 4 -1005)——中国剩余定理 + 容斥原理
- BNU Training 2016.07.29 Div. 2-B-Levko and Table
- hdu 1151 Air Raid(最小路径覆盖)
- 2016 Multi-University Training Contest 4
- List和set集合:交集、差集、合集的区别retainAll,removeAll、addAll
- 黑箱中的 retain 和 release
- Unable to simultaneously satisfy constraints.
- 【一天一道LeetCode】#219. Contains Duplicate II