CF547D Mike and Fish 建图

题意:

  有点长→CF547DMike and Fish。

分析:

  其实也没什么好分析的,我这也是看的题解。

  (不过,那篇题解好像文字的代码不太对劲)

  这里直接说做法,正确性自证:

  对输入的,将横、纵坐标相等的点分别两两连边,之后只需要dfs跑一个染色,使得一条边两个端点颜色都不一样即可,这样就可以确定每一个点放红色还是蓝色,输出即可。(至于哪个是红哪个是蓝不重要,有spj)

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=500005;int n,m;
 4 struct node{int y,nxt;}e[2*N];
 5 int h[N],c=1,vis[N],ans[N][2];
 6 void add(int x,int y){
 7     e[++c]=(node){y,h[x]};h[x]=c;
 8     e[++c]=(node){x,h[y]};h[y]=c;
 9 } void dfs(int x,int y){
10     if(vis[x]) return ;vis[x]=y;
11     for(int i=h[x];i;i=e[i].nxt)
12     dfs(e[i].y,1^y);
13 } int main(){
14     scanf("%d",&n);
15     for(int i=1,x,y;i<=n;i++){
16         scanf("%d%d",&x,&y);
17         if(ans[x][0])
18         add(ans[x][0],i),ans[x][0]=0;
19         else ans[x][0]=i;
20         if(ans[y][1])
21         add(ans[y][1],i),ans[y][1]=0;
22         else ans[y][1]=i;
23     } for(int i=1;i<=n;i++){
24         dfs(i,0);
25         if(vis[i]) putchar(‘r‘);
26         else putchar(‘b‘);
27     } return 0;
28 }

染色

原文地址:https://www.cnblogs.com/Alan-Luo/p/10432324.html

时间: 2024-10-13 10:40:21

CF547D Mike and Fish 建图的相关文章

cf547D. Mike and Fish(欧拉回路)

题意 题目链接 Sol 说实话这题我到现在都不知道咋A的. 考试的时候是对任意相邻点之间连边,然后一分没有 然后改成每两个之间连一条边就A了.. 按说是可以过掉任意坐标上的点都是偶数的数据啊.. #include<cstdio> #include<algorithm> #include<iostream> #include<vector> #include<cstring> #include<queue> #define Pair p

Codeforces 247D Mike and Fish

Mike and Fish 我们可以把这个模型转换一下就变成有两类点,一类是X轴, 一类是Y轴, 每个点相当于对应的点之间建一条边, 如果这条边变红两点同时+1, 变蓝两点同时-1. 我们能发现这个图其实是个二分图, 我们可以随便取一个点开始走路, 红蓝间隔开来,那么中间的点就权值不变, 对于最末尾的点虽然权值有改变,但是只会改变一次, 就这样一直走路直到所有的边都遍历完. #include<bits/stdc++.h> #define LL long long #define fi firs

POJ 2724 奶酪消毒机 二分匹配 建图 比较难想

Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5004   Accepted: 1444 Description Mike is the owner of a cheese factory. He has 2N cheeses and each cheese is given a binary number from 00...0 to 11...1. To keep his chee

CF 547 D. Mike and Fish

D. Mike and Fish http://codeforces.com/contest/547/problem/D 题意: 给定平面上n个点,将这些点染成红或者蓝色,要求每行.每列红色点与蓝色点数量的差的绝对值<=1.输出方案(保证有解). 分析: 参考popoqqq的博客 将每行每列分别看做一个点,给定的每个点(x,y)拆成x->y的边,那么连边后的图是一个二分图. 这样我们可以将边染色,使得与每个点相连的两种颜色差<=1. 于是对于所有的欧拉回路,我们可以直接交替染色. 但是会

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给出火警位置所在的交叉路口 和 一个或多个消防站所处的交叉路口位置.输出要求按消防站到火警位置所需时间从小到大排列,输出信息包括消防站位置(初始位置),火警位置(目标位置),所需时间,最短路径上每个交叉路口. 题解:反向建图,从火警位置求一次最短路,求最短路时记录路径,按时间从小到大输出. 1 #in

HDU5772 String problem 最大权闭合图+巧妙建图

题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个点拆出一个点,第i个点权值为 –a[s[i]] (表示要花费) 第三类:对于10种字符拆出10个点,每个点的权值为  -(b[x]-a[x]) 那么我们可以得到一个关系图 ,对于第一类中的点Pij,如果想要选择Pij,你就必须要选中第二类中的点i和j,对于第二类中的点

4205: 卡牌配对 最大流+建图技巧

很明显该题应该是二分图最大匹配,但该题不可能N^2建图,那么我们要怎么办呢?而且有三个属性. 注意到 Ai <= 200 而且 200 以内的质数只有49个,那么我们就可以对着仅有的49个质数下毒手了.很明显如果 Ai 与 Aj 不互质的话, 两者应该有一个共同质因子. B和C同理. 那么我们可以在S集和T集中间建3层质因子的墙,分别为A和B, B和C, C和A. 只有当 Ai 被第 x 个质因子整除, Bi 被第 y 个质因子整除时, 我们从 i 往 P[0][x][y] 连边. 其他同理.

HDU5669 Road 分层最短路+线段树建图

分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ?的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维护整个图, 连边时候找到对应区间,把线段树的节点之间连边.这样可以大大缩减边的规模,然后再跑分层图最短路就可以了. 但是这样建图,每一次加边都要在O(logn)个线段树节点上加边,虽然跑的非常快,但是复杂度仍然是不科学的. 为了解决边的规模的问题,开两棵线段树,连边时候可以新建一个中间节点,在对应区