spoj839Optimal Marks
题意:略
怎样判断属于S,T集合。
如果从S出发到不了某点,该点出发也到不了T,那么割给那边都行。
如果S出发能到该点,该点出发也能到T,这种情况下dinic没结束。
只能从S到该点:只能分到S集。只能从该点到T,T集。
这题中两种都能分到时,假如S表示0,那贪心分到S。这样只要看它能不能到T,如果能到T,一定要选1,否则就选0.用类似SPFA的操作。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=,APB=,one=,INF=0x7FFFFFFF,mod=;
int n,m,src[SZ][SZ],knum,arr[SZ],S=,T=;
int ans[SZ],mp[SZ][SZ],dep[SZ];
bool vst[SZ]; void init()
{
cin>>n>>m;
for(int i=;i<=m;++i)
{
int a,b;
cin>>a>>b;
src[a][b]=src[b][a]=;
}
cin>>knum;
for(int i=;i<=knum;++i)
{
int a,b;
cin>>a>>b;
ans[a]=arr[a]=b;
vst[a]=;
}
} void add(int u,int v,int w)
{
mp[u][v]=w;
} bool bfs()
{
memset(dep,,sizeof(dep));
dep[S]=;
queue<int> q;
q.push(S);
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=;i<=T;++i)
{
if(!dep[i]&&mp[fr][i])
{
dep[i]=dep[fr]+;
q.push(i);
if(i==T)return ;
}
}
}
return ;
} int dinic(int x,int flow)
{
if(x==T)return flow;
else
{
int rem=flow;
for(int i=;i<=T&&rem;++i)
{
if(dep[i]==dep[x]+&&mp[x][i])
{
int tmp=dinic(i,min(rem,mp[x][i]));
if(!tmp)dep[i]=;
rem-=tmp;
mp[x][i]-=tmp,mp[i][x]+=tmp;
}
}
return flow-rem;
}
} void build(int x)
{
memcpy(mp,src,sizeof(src));
for(int i=;i<=n;++i)
{
if(vst[i])
{
if(arr[i]&(<<x))
{
add(i,T,INF);
add(T,i,);
}
else
{
add(S,i,INF);
add(i,S,);
}
}
else
{
// add(S,i,APB);
// add(i,S,0);
// add(i,T,APB);
// add(T,i,0);
}
}
} int v2[SZ]; void calc(int x)
{
memset(v2,,sizeof(v2));
queue<int> q;
for(int i=;i<=n;++i)
{
if(mp[i][T])v2[i]=,q.push(i);
}
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=;i<=n;++i)
{
if(!v2[i]&&mp[i][fr])
{
v2[i]=;
q.push(i);
}
}
}
for(int i=;i<=n;++i)
{
//if(x==0)cout<<v2[i]<<endl;
if(v2[i]&&!vst[i])ans[i]|=<<x;
}
} void work()
{
for(int i=;i<;++i)
{
build(i);
int res=;
for(;bfs();)res+=dinic(S,INF);
//cout<<"res: "<<res<<endl;
calc(i);
}
for(int i=;i<=n;++i)
{
cout<<ans[i]<<endl;
}
} void release()
{
memset(vst,,sizeof(vst));
memset(src,,sizeof(src));
memset(ans,,sizeof(ans));
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
//cout<<(1<<31)<<endl;
int casenum;
cin>>casenum;
//cout<<casenum<<endl;
for(int time=;time<=casenum;++time)
//for(int time=1;scanf(" %s",ch+1)!=EOF;++time)
{
init();
work();
release();
}
return ;
}
spoj839Optimal Marks的更多相关文章
- 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 567 Solved: 202[Submit ...
- 贪心 Codeforces Round #301 (Div. 2) B. School Marks
题目传送门 /* 贪心:首先要注意,y是中位数的要求:先把其他的都设置为1,那么最多有(n-1)/2个比y小的,cnt记录比y小的个数 num1是输出的1的个数,numy是除此之外的数都为y,此时的n ...
- 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 ...
- (CodeForces )540B School Marks 贪心 (中位数)
Little Vova studies programming to p. Vova is very smart and he can write every test for any mark, b ...
- 图论(网络流):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 ...
- CodeForces 540B School Marks(思维)
B. School Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 【SPOJ839】Optimal Marks 网络流
You are given an undirected graph G(V, E). Each vertex has a mark which is an integer from the range ...
- The table name must be enclosed in double quotation marks or sqare bracket while accessing EXCEL by
1 Preface DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has Eng ...
- Codeforces831C Jury Marks
C. Jury Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
随机推荐
- PHP 面向对象之单例模式-有些类也需要计划生育
一个类只有一个实例对象 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2 ...
- 【数据结构】算法 LinkList (Remove Nth Node From End of List)
删除链表中倒数第n个节点 时间复杂度要控制在O(n)Solution:设置2个指针,一个用于确定删除节点的位置,一个用于计算倒数间距n.移动时保持2个指针同时移动. public ListNode r ...
- ubuntu16.04+ROS安装kinectV1
1.安装驱动 安装ROS软件包以下2种方式,任选一种即可,当然全部安装也没有问题 1)使用openni_launch sudo apt-get install ros-kinetic-openni-c ...
- Mysql 导入文件提示 --secure-file-priv option 问题
MYSQL导入数据出现:The MySQL server is running with the --secure-file-priv option so it cannot execute this ...
- python习题二
1.输入1-127的ascii码并输出对应的字符 for i in range(1,128): print(chr(i)) 2.输入a,b,c,d,4个整数,计算a+b-c*d的结果 a = i ...
- 继承 派生 super()经典类 新式类
'''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...
- Spring cloud Greenwich Eureka
1.父工程POM文件中: <dependencyManagement> <dependencies> <!--spring cloud--> <depende ...
- 《Java程序设计》课程实验要求
目录 <Java程序设计>课程实验要求 注册实验楼账号 实验一 Java开发环境的熟悉 实验二<Java面向对象程序设计> 实验三 <敏捷开发与XP实践> 实验四 ...
- 清北学堂北京大学冯哲神仙讲课day2
今天讲基础数据结构 首先讲(二叉搜索树) 保证左儿子小于右儿子,那么对于根节点来说.大于根节点的放到右子树递归,小于根节点的放在左子树 相等的呢?某大佬(老师)这么说: 删除的前提是找这个点在哪: 如 ...
- 大数据开发认知--spark
1. Spark rdd生成过程· Spark的任务调度分为四步 1RDD objects RDD的准备阶段,组织RDD及RDD的依赖关系生成大概的RDD的DAG图,DAG图是有向环图. 2DAG s ...