传送门

一个无向图,每个点有点权,某些点点权确定了,某些点由你来确定,边权为两个点的异或和,要使边权和最小。

这不是一道按位做最小割的大水题么

非常开心地打了,还非常开心地以为有spj,然后非常开心地Wa了

才发现在边权和最小的条件下还要让点权和最小。

这可咋整啊,难不成要费用流。

然后悄悄搜了下题解发现了巧妙的解决方法,把原来建的图中的边权都扩大10000倍,然后在选1的地方边权再悄悄加上1

把它看成10000和1两条边的话,相当于优先考虑大边最小,大边最小的前提下小边最小,即答案。

  1. //Achen
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<vector>
  7. #include<cstdio>
  8. #include<queue>
  9. #include<cmath>
  10. #include<set>
  11. #include<map>
  12. #define Formylove return 0
  13. #define For(i,a,b) for(int i=(a);i<=(b);i++)
  14. #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
  15. const int M=*,N=;
  16. typedef long long LL;
  17. typedef double db;
  18. using namespace std;
  19. int n,m,k,qd[N],val[N],ec[M][];
  20.  
  21. template<typename T>void read(T &x) {
  22. char ch=getchar(); x=; T f=;
  23. while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
  24. if(ch=='-') f=-,ch=getchar();
  25. for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
  26. }
  27.  
  28. struct edge {
  29. int u,v,cap,fl,nx;
  30. edge(){}
  31. edge(int u,int v,int cap,int fl,int nx):u(u),v(v),cap(cap),fl(fl),nx(nx){}
  32. }e[M];
  33.  
  34. int ecnt=,fir[N];
  35. void add(int u,int v,int cap) {
  36. e[++ecnt]=edge(u,v,cap,,fir[u]); fir[u]=ecnt;
  37. //printf("%d->%d:%d\n",u,v,cap);
  38. e[++ecnt]=edge(v,u,,,fir[v]); fir[v]=ecnt;
  39. }
  40.  
  41. queue<int>que;
  42. int d[N];
  43. void bfs(int s,int t) {
  44. que.push(t);
  45. For(i,,n) d[i]=n;
  46. d[t]=;
  47. while(!que.empty()) {
  48. int x=que.front();
  49. que.pop();
  50. for(int i=fir[x];i;i=e[i].nx) {
  51. int y=e[i].v;
  52. if(d[y]==n&&e[i].cap==) {
  53. d[y]=d[x]+;
  54. que.push(y);
  55. }
  56. }
  57. }
  58. }
  59.  
  60. #define inf 1e9
  61. int p[N];
  62. int calc(int s,int t) {
  63. int fl=inf;
  64. for(int i=t;i!=s;i=e[p[i]].u)
  65. fl=min(fl,e[p[i]].cap-e[p[i]].fl);
  66. for(int i=t;i!=s;i=e[p[i]].u)
  67. e[p[i]].fl+=fl,e[p[i]^].fl-=fl;
  68. return fl;
  69. }
  70.  
  71. int c[N],cur[N];
  72. int isap(int s,int t) {
  73. For(i,,n) c[i]=;
  74. bfs(s,t);
  75. For(i,,n) cur[i]=fir[i],c[d[i]]++;
  76. int rs=;
  77. for(int x=s;d[x]<n;) {
  78. if(x==t) {
  79. rs+=calc(s,t);
  80. x=s;
  81. }
  82. int ok=;
  83. for(int &i=cur[x];i;i=e[i].nx) if(e[i].cap>e[i].fl&&d[e[i].v]+==d[x]) {
  84. ok=; p[x=e[i].v]=i; break;
  85. }
  86. if(!ok) {
  87. int D=n; cur[x]=fir[x];
  88. for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl)
  89. D=min(D,d[e[i].v]+);
  90. if(!(--c[d[x]])) break;
  91. c[d[x]=D]++;
  92. if(x!=s) x=e[p[x]].u;
  93. }
  94. }
  95. return rs;
  96. }
  97.  
  98. void init() {
  99. ecnt=;
  100. memset(fir,,sizeof(fir));
  101. }
  102.  
  103. int vis[N];
  104. void dfs(int x) {
  105. vis[x]=;
  106. for(int i=fir[x];i;i=e[i].nx) if(!vis[e[i].v]&&e[i].cap>e[i].fl)
  107. dfs(e[i].v);
  108. }
  109.  
  110. int main() {
  111. #ifdef ANS
  112. freopen(".in","r",stdin);
  113. freopen(".out","w",stdout);
  114. #endif
  115. int T; read(T);
  116. while(T--) {
  117. read(n); read(m);
  118. For(i,,m) {
  119. read(ec[i][]);
  120. read(ec[i][]);
  121. }
  122. read(k);
  123. For(i,,n) val[i]=,qd[i]=;
  124. For(i,,k) {
  125. int x;
  126. read(x); qd[x]=;
  127. read(val[x]);
  128. }
  129. int s=n+,t=n+;
  130. For(i,,) {
  131. init();
  132. For(j,,n) {
  133. if(qd[j]) {
  134. if(val[j]&(<<i)) {
  135. add(s,j,);
  136. add(j,t,inf);
  137. }
  138. else {
  139. add(s,j,inf);
  140. add(j,t,);
  141. }
  142. }
  143. else {
  144. add(s,j,);
  145. add(j,t,);
  146. }
  147. }
  148. For(j,,m) {
  149. int u=ec[j][],v=ec[j][];
  150. add(u,v,); add(v,u,);
  151. }
  152. n+=;
  153. isap(s,t);
  154. n-=;
  155. memset(vis,,sizeof(vis));
  156. dfs(s);
  157. For(j,,n) if(!vis[j]) val[j]|=(<<i);
  158. }
  159. For(i,,n) printf("%d\n",val[i]);
  160. //printf("%d\n",val[n]);
  161. /*long long ans=0;
  162. for(int i=1;i<=m;i++) {
  163. int u=ec[i][0],v=ec[i][1];
  164. ans+=(val[u]^val[v]);
  165. }
  166. printf("%lld\n",ans);*/
  167. }
  168. Formylove;
  169. }
  170. /*
  171. 1
  172. 6 7
  173. 1 2
  174. 2 4
  175. 1 3
  176. 2 3
  177. 4 3
  178. 1 5
  179. 5 6
  180. 4
  181. 1 5
  182. 3 1
  183. 4 7
  184. 6 2
  185. */

Optimal Marks SPOJ - OPTM的更多相关文章

  1. Optimal Marks SPOJ - OPTM (按位枚举-最小割)

    题意:给一张无向图,每个点有其点权,边(i,j)的cost是\(val_i\ XOR \ val_j\).现在只给出K个点的权值,求如何安排其余的点,使总花费最小. 分析:题目保证权值不超过32位整型 ...

  2. Optimal Marks SPOJ - OPTM(最小割)

    传送门 论文<最小割模型在信息学竞赛中的应用>原题 二进制不同位上互不影响,那么就按位跑网络流 每一位上,确定的点值为1的与S连一条容量为INF的有向边.为0的与T连一条容量为INF的有向 ...

  3. 839. Optimal Marks - SPOJ

    You are given an undirected graph G(V, E). Each vertex has a mark which is an integer from the range ...

  4. Optimal Marks SPOJ 839

    这题远超其他题非常靠近最小割的实际意义: 割边<=>付出代价<=>决定让两个点的值不相同,边权增加 最小割<=>点的值与s一个阵营的与s相同,与t一个阵营的与t相同 ...

  5. 图论(网络流):SPOJ OPTM - Optimal Marks

    OPTM - Optimal Marks You are given an undirected graph G(V, E). Each vertex has a mark which is an i ...

  6. SPOJ OPTM - Optimal Marks

    OPTM - Optimal Marks no tags  You are given an undirected graph G(V, E). Each vertex has a mark whic ...

  7. 【bzoj2400】Spoj 839 Optimal Marks 按位最大流

    Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 908  Solved: 347[Submit][Stat ...

  8. 【BZOJ2400】Spoj 839 Optimal Marks 最小割

    [BZOJ2400]Spoj 839 Optimal Marks Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. ...

  9. SP839 Optimal marks(最小割)

    SP839 Optimal marks(最小割) 给你一个无向图G(V,E). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记.对于边(u,v),我们定义Cost(u,v)= ...

随机推荐

  1. Web前端/全栈核心(html5/css3/js/vue/react/angular/es6/node)观看笔记

    a标签中的超链接,需要加   http://    否则会出现页面找不到. iframe中添加a标签,a标签中的target属性可以控制即将打开的页面,在那个位置显示. _blank 在新窗口中打开被 ...

  2. java 多上传 CommonsMultipartFile[] files

    /** * 视频上传 * ddl * @param request * @param response * @param files * @return * @throws Exception */@ ...

  3. PHP ftp_alloc() 函数

    定义和用法 ftp_alloc() 函数为要上传到 FTP 服务器的文件分配空间. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_alloc(ftp_connectio ...

  4. Linux特殊权限设置以及使用

    Linux文件权限特殊权限(s-s-t) 什么是suid权限 SUID是可执行文件的特殊文件权限,使其他用户能够以文件所有者的有效权限运行文件. 代替执行权限的正常x代替用户的s(指示SUID )特权 ...

  5. NX二次开发-Block UI C++界面Object Color Picker(对象颜色拾取器)控件的获取(持续补充)

    Object Color Picker(对象颜色拾取器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_init ...

  6. JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)

    CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...

  7. JAVA常用集合解析

    ArrayList : 底层基于数组实现,在使用add方法添加元素时,首先校验集合容量,将新添加的值放入集合尾部并进行长度加一,进行自动扩容,扩容的操作时将数据中的所有元素复制到新的集合中. 在指定位 ...

  8. java xmltojson jsontoxml

    JSONObject.fromObject需要的有额外的6个包,必不可少,一定要注意: commons-beanutils-1.9.2.jar      commons-collections-3.2 ...

  9. Lilo的实现

    书承上文:http://www.cnblogs.com/long123king/p/3549267.html 我们找一份Lilo的源码来看一下 http://freecode.com/projects ...

  10. Java对图片压缩

    背景:图片上传服务器时候的大小限制取消之后,上传图片太大导致前台显示加载缓慢 需求:服务器对接收到的图片进行压缩 方法:1.上传后的文件保存在临时文件夹“/usr/upload/tmp”    2.压 ...