省赛比完了,进了工作室学做项目,闲来无聊看看网络流建模,这题想半天没想出硬是想不出和网络流有关系,看了07年胡伯涛的论文才有的思路,觉得这题很经典,所以就写了一下。
第一次用VS写的题,小小的纪念一下,呵呵。
发现VS的调试功能真强大!
代码:本来定义N是550M是15000的,抱着侥幸的心态加了个0居然AC了,N题目明明是500吗,真是费解!
#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 5500
#define M 150000
#define INF 100000000
int U[N],V[N];
bool stable[N],vis[N];
int lable[N],lab[N];
int base;
struct Node{
int u,v,next;
int c;
};
struct Graph
{
Node E[M];
int first[N];
int _V,_E,src,dest;
int que[N],front,rear;
int d[N];
void init(int n){
_V=n,_E=0;
src=0;dest=_V-1;
memset(first,-1,4*_V);//!!!
}
bool build(int n,int m)
{
bool finish=true;
init(n+2);
for(int i=0;i<m;i++){
add(U[i],V[i],1);
add(V[i],U[i],1);
}
for(int i=1;i<=n;i++){
if(stable[i]){
if(lable[i])finish=false;
if(lable[i]&1){
add(src,i,INF);
add(i,src,0);
}
else add(i,dest,INF),add(dest,i,0);
lable[i]>>=1;
}
}
return finish;
/*建图*/
}
void DFS(int u){
vis[u]=true;
for(int e=first[u];e!=-1;e=E[e].next){
int c=E[e].c,v=E[e].v;
if(c&&!vis[v]){
if(!stable[v])lab[v]|=base;
DFS(v);
}
}
}
void add(int u,int v,int c){
E[_E].u=u,E[_E].v=v,E[_E].c=c,E[_E].next=first[u],first[u]=_E,_E++;
}
bool bfs()
{
memset(d,-1,4*_V);//!!!
d[src]=0;
front=rear=0;
que[rear++]=src;
while(front!=rear){
int u=que[front++];
for(int e=first[u];e!=-1;e=E[e].next){
int v=E[e].v;
if(d[v]==-1&&E[e].c){
d[v]=d[u]+1;
que[rear++]=v;
}
if(d[dest]!=-1)return true;
}
}
return false;
}
int dfs(int u,int cap)
{
if(u==dest)return cap;
int rest=cap,aug;
for(int e=first[u];e!=-1&&rest;e=E[e].next){//
int v=E[e].v,c=E[e].c;
if(d[v]==d[u]+1&&c){
aug=dfs(v,rest>c?c:rest);
rest-=aug;
E[e].c-=aug;
E[e^1].c+=aug;
}
}
return cap-rest;
}
int dinic(){
int flow=0;
while(bfs())flow+=dfs(src,INF);
return flow;
}
void display(){
for(int i=0; i<_V; i++){
for(int e=first[i]; e!=-1; e=E[e].next){
int u=E[e].u,v=E[e].v;
int c=E[e].c;
cout<<u<<' '<<v<<' ';
printf("%d\n",c);
}
}
}
}net;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt","w",stdout);
#endif
int T,n,m;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",U+i,V+i);
}
memset(stable,0,sizeof(stable));
memset(lab,0,sizeof(lab));
memset(lable,0,sizeof(lable));
int u,w,k;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%d",&u,&w);
lab[u]=lable[u]=w;
stable[u]=true;
}
base=1;
while(!net.build(n,m)){
// net.display();
net.dinic();
memset(vis,0,sizeof(vis));
net.DFS(net.src);
base<<=1;
}
for(int i=1;i<=n;i++)printf("%d\n",lab[i]);
}
return 0;
}