这道题的原题目我也不知道是什么。

大致题意是有一个图,有些点的权值已确定,要求你确定其他点的权值使所有边两个点的权值的xor和最小,输出所有点的最终权值,输出有spj;

解法是最小割,由于题目要求的使xor的和最小,那么可以对一位一位考虑;

既然可以这样考虑,那么我们要求的就是在固定了一些点的0/1值的情况下,使xor为1的结果数最少,xor的性质是不相同值为1,相同值为0;

那么就是最小割了,将已确定为0的与s/t连边,将已确定为1de与s/t连边,跑最小割,在残余网络上记录方案;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define LL long long
#define up(i,j,n) for(int i=(j);i<=(n);i++)
#define FILE "dealing"
#define pii pair<int,int>
int read(){
int ch=getchar(),x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f*x;
}
const int maxn=10010,inf=100000000;
int n,m,k,limit,s=0,t=501;
struct node{
int y,next,flow,rev;
}e[maxn];
int linkk[maxn],len=0;
int f[maxn][33],cnt=0,vis[maxn],c[maxn],z[maxn],X[maxn],Y[maxn],T[maxn];
void insert(int x,int y,int flow){
e[++len].y=y;
e[len].flow=flow;
e[len].next=linkk[x];
linkk[x]=len;
e[len].rev=len+1;
e[++len].y=x;
e[len].flow=0;
e[len].next=linkk[y];
e[len].rev=len-1;
linkk[y]=len;
}
int q[maxn],d[maxn],head,tail;
bool makelevel(){
head=tail=0;
memset(d,-1,sizeof(d));
q[++tail]=s;d[s]=0;int x;
while(++head<=tail){
x=q[head];
for(int i=linkk[x];i;i=e[i].next)
if(d[e[i].y]==-1&&e[i].flow)q[++tail]=e[i].y,d[e[i].y]=d[x]+1;
}
return d[t]!=-1;
}
int makeflow(int x,int flow){
if(x==t)return flow;
if(!flow)return 0;
int dis=0,maxflow=0;
for(int i=linkk[x];i&&maxflow<flow;i=e[i].next){
if(e[i].flow&&d[e[i].y]==d[x]+1)
if(dis=makeflow(e[i].y,min(e[i].flow,flow-maxflow))){
e[e[i].rev].flow+=dis;
e[i].flow-=dis;
maxflow+=dis;
}
}
if(!maxflow)d[x]=-1;
return maxflow;
}
int dinic(){
int d,ans=0;
while(makelevel())
while(d=makeflow(s,inf))
ans+=d;
return ans;
}
void dfs(int x){
vis[x]=1;
for(int i=linkk[x];i;i=e[i].next)
if(!vis[e[i].y]&&e[i].flow)dfs(e[i].y);
}
int main(){
n=read(),m=read();
up(i,1,m)X[i]=read(),Y[i]=read();
k=read();
up(i,1,k){
c[i]=read();T[c[i]]=1;
int x=z[i]=read(),cnt=0;
while(x){
f[c[i]][++cnt]=x%2;
x/=2;
}
limit=max(limit,cnt);
}
up(i,1,limit){
len=0;
memset(linkk,0,sizeof(linkk));
int f1=0,f2=0;
up(j,1,k){
if(f[c[j]][i]==0)insert(c[j],t,inf),f1=1;
else insert(s,c[j],inf),f2=1;
}
up(j,1,m)insert(X[j],Y[j],1),insert(Y[j],X[j],1);
dinic();
memset(vis,0,sizeof(vis));
dfs(s);
if(f1&&f2)up(j,1,n)if(!T[j]&&vis[j])f[j][i]=1;
}
up(i,1,n){
int x=0;
up(j,1,limit)if(f[i][j])x+=(1<<j-1);
printf("%d\n",x);
}
return 0;
}

  

最新文章

  1. 远程管理无管理员权限的PC客户端
  2. KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定
  3. Bois设置教程
  4. Scala-Trait:混入与多态
  5. H5课程大纲
  6. VS错误 error LNK1158: 无法运行“cvtres.exe”
  7. SQL2005中的事务与锁定(二)- 转载
  8. HTTP协议的chunked编码
  9. EmguCV学习——简单使用
  10. MySQL(25):事务的隔离级别出现问题之 不可重复读
  11. haskell趣学指南笔记1
  12. Android应用程序组件Content Provider的启动过程源代码分析
  13. Python3.2官方文档-日志和弱引用
  14. Node.js模块导出module.exports 和 exports,Es6模块导出export 和export default的区别
  15. 16 道嵌入式C语言面试题
  16. project 2013 工时完成百分比不会自动更新填充
  17. Xamarin.Android 本地数据库 SQLiteDatabase 操作
  18. mint-ui之Loadmore使用
  19. LeetCode 题解之Add Digits
  20. Yarn执行流程

热门文章

  1. P2P应用中的NAT穿透问题
  2. label ichartjs
  3. Entity Framework 学习初级篇2--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍
  4. 选择LDO的方法(转)
  5. C# 中的内存管理,摘自网络
  6. Brain Network (easy)
  7. android里uri和url的区别
  8. android 屏幕适配小结
  9. 笔记:利用Cocos2dx 3.3 lua 做一个动作类游戏(一)
  10. 改变cinder默认vg的方法