You are given an undirected graph G(V, E). Each vertex has a mark which is an integer from the range [0..231 – 1]. Different vertexes may have the same mark.

For an edge (u, v), we define Cost(u, v) = mark[u] xor mark[v].

Now we know the marks of some certain nodes. You have to determine the marks of other nodes so that the total cost of edges is as small as possible.

Input

The first line of the input data contains integer T (1 ≤ T ≤ 10) - the number of testcases. Then the descriptions of T testcases follow.

First line of each testcase contains 2 integers N and M (0 < N <= 500, 0 <= M <= 3000). N is the number of vertexes and M is the number of edges. Then M lines describing edges follow, each of them contains two integers u, v representing an edge connecting u and v.

Then an integer K, representing the number of nodes whose mark is known. The next K lines contain 2 integers u and p each, meaning that node u has a mark p. It’s guaranteed that nodes won’t duplicate in this part.

Output

For each testcase you should print N lines integer the output. The Kth line contains an integer number representing the mark of node K. If there are several solutions, you have to output the one which minimize the sum of marks. If there are several solutions, just output any of them.

Example

Input:

1

3 2

1 2

2 3

2

1 5

3 100

Output:

5

4

100

在Amber的最小割论文上看到的一道题。





考虑到是异或运算求最小cost之和,由于对于二进制,各个位之间是互不影响的,所以可以将问题转会为每个二进制位的求解,然后求和即可。对于每个二进制位,要么为0,要么为1, 就想到将整个图切割成两个点

集,即对于每个点,都只有两种取值,可以看成是要将点集划分成两类。在这种分类思想的指导下,重新考察操作的意义:对于边的两个端点,若它们同类则边权无值;若它们异类则边权有值1。

建一源点S,汇点T

对于已经标号过的点:

1. 对于位为1的点建边 < S, V, INF, 0>

2. 对于位为0的点建边 < V, T, INF, 0>

对于所有的原边

建成流量为1的双向边< u, v, 1, 1>

这样求得最小割,即为当前位的最优解。

这样建边,求最小割时,保证了割边都是原边,求完后,所有与S相连的点可以标号为1, 所有与T相连的边标号为0, 那么这些割边即为相邻点异类的边,同时保证了他们的和最小。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int MaxN = 550; const int MaxM = 3100; typedef struct node
{
int u,v;
}Point; typedef struct Node
{
int v,next,cap;
}edge ; Point a[MaxM]; edge e[MaxM*10]; int mark[MaxN],vis[MaxN],Ans[MaxN]; int H[MaxN]; int n,m,k,s,t,top; void AddEdge(int u,int v,int w1,int w2)
{
e[top].v = v; e[top].cap = w1; e[top].next = H[u]; H[u]= top++; e[top].v = u; e[top].cap = w2; e[top].next = H[v]; H[v] = top++;
} bool BFS()
{
memset(vis,0,sizeof(vis)); queue<int>Q; vis[s] = 1; Q.push(s); while(!Q.empty())
{
int u =Q.front(); Q.pop(); for(int i=H[u];~i;i=e[i].next)
{
if(e[i].cap>0&&!vis[e[i].v])
{
vis[e[i].v] = vis[u]+1; Q.push(e[i].v);
}
}
} return vis[t];
} int DFS(int u,int cap)
{
if(u==t)
{
return cap;
} int ans = 0; for(int i=H[u];~i;i=e[i].next)
{
if(e[i].cap>0&&vis[e[i].v]==vis[u]+1)
{
int ant = DFS(e[i].v,min(e[i].cap,cap)); ans += ant; cap -= ant; e[i].cap-=ant; e[i^1].cap+=ant; if(cap==0)
{
break;
}
}
} return ans;
} void Dinic()
{
while(BFS())
{
DFS(s,INF);
}
} void dfs(int u,int bite)
{
vis[u] = 1; Ans[u]+=bite; for(int i = H[u];i!=-1;i=e[i].next)//和S相连都为1
{
if(e[i].cap>0&&!vis[e[i].v])
{
dfs(e[i].v,bite);
}
}
}
void Solve()
{
int bite=1; memset(Ans,0,sizeof(Ans)); while(1)
{
top = 0; memset(H,-1,sizeof(H)); for(int i=1;i<=m;i++)
{
AddEdge(a[i].u,a[i].v,1,1);
} bool flag=false; for(int i=1;i<=n;i++) //以每一位求一次最小割
{
if(mark[i]!=-1)
{
if(mark[i]>=1)
{
flag=true;
}
if(mark[i]%2)
{
AddEdge(s,i,INF,0);
}
else
{
AddEdge(i,t,INF,0);
} mark[i]>>=1;
}
} if(!flag)//都为零的时候算法结束
{
break;
} Dinic(); memset(vis,0,sizeof(vis)); dfs(s,bite); bite<<=1;
} for(int i=1;i<=n;i++)
{
if(i!=1) printf(" "); printf("%d",Ans[i]);
}
puts("");
} int main()
{
int T; scanf("%d",&T); int u,v,w; while(T--)
{
scanf("%d %d",&n,&m); s=0,t=n+1; for(int i=1;i<=m;i++) scanf("%d %d",&a[i].u,&a[i].v); scanf("%d",&k); memset(mark,-1,sizeof(mark)); for(int i=1;i<=k;i++)
{
scanf("%d %d",&u,&w); mark[u] = w;
} Solve();
}
return 0;
}

OPTM-Optimal Marks-SPOJ839最小割的更多相关文章

  1. SPOJ 839 OPTM - Optimal Marks (最小割)(权值扩大,灵活应用除和取模)

    http://www.spoj.com/problems/OPTM/ 题意: 给出一张图,点有点权,边有边权 定义一条边的权值为其连接两点的异或和 定义一张图的权值为所有边的权值之和 已知部分点的点权 ...

  2. SP839 Optimal marks(最小割)

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

  3. SPOJ839 Optimal Marks(最小割)

    题目大概说给一张图,每个点都有权,边的权等于其两端点权的异或和,现已知几个点的权,为了使所有边的边权和最小,其他点的权值该是多少. 很有意思的一道题,完全看不出和网络流有什么关系. 考虑每个未知的点$ ...

  4. spoj839 Optimal Marks(最小割,dinic)

    题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...

  5. SPOJ 839 Optimal Marks(最小割的应用)

    https://vjudge.net/problem/SPOJ-OPTM 题意: 给出一个无向图G,每个点 v 以一个有界非负整数 lv 作为标号,每条边e=(u,v)的权w定义为该边的两个端点的标号 ...

  6. 【bzoj2400】Spoj 839 Optimal Marks 网络流最小割

    题目描述 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其余的点的值由你 ...

  7. 图论(网络流):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 ...

  8. SPOJ OPTM - Optimal Marks

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

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

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

  10. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

随机推荐

  1. 【原】使用Xfermode正确的绘制出遮罩效果

    以前写as3的时候,遮罩效果一个mask属性就搞定了,真是方便. 转到android上以后,发现要实现类似的效果,可以使用Xfermode,android一共提供了三种: AvoidXfermode; ...

  2. Windows RabbitMQ 命令

    启动: 后台运行:rabbitmq-server -detached D:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.6\sbin>ra ...

  3. AngularJS Best Practices: resource

    A factory which creates a resource object that lets you interact with RESTful server-side data sourc ...

  4. lkx开发日志1-项目前的准备

    遇到的问题 不了解github的使用 不能熟练的用Markdown编辑,比如:放入图片 虚拟机的认知也还是有点模糊 解决的方法 参照老师博文给出的链接,好好学习实操一遍 多请教组员,很多小问题便迎刃而 ...

  5. ubuntu启动tomcat出错解决方案

    从终端进入tomcat的bin目录,然后执行startup.sh,出现以下异常: Cannot find ./catalina.sh The file is absent or does not ha ...

  6. GPS部标平台的架构设计(一)

    设计和开发一个GPS系统似乎并不太难,很多人马上就想到了地图,放大,缩小之类的功能,最多就是在加点报表之类的东西,就成了. 这种观点造成了业界内,很多GPS系统粗制滥造,不堪大用. 事实上,设计和开发 ...

  7. 网页3D引擎“Babylon.JS”入门教程翻译总结

    使用三个月的业余时间把官方教程的入门部分译为中文并上传到github,在下一步编程前做一个总结. 历程: 最早接触游戏编程是在大三下学期,用汇编语言和实验室里的单片机.触摸屏.电机(提供声效)编的打地 ...

  8. chrome调试 JavaScript 脚本

    随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...

  9. linux定时任务的设置 crontab 配置指南

    为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...

  10. 夺命雷公狗-----React---15--三元运算符

    <!DOCTYPE> <html> <head> <meta charset="utf-8"> <title></ ...