ural 1339. Babies
2015-11-26 21:57
274 查看
1339. Babies
Time limit: 1.0 secondMemory limit: 64 MB
O tempora! O mores!
Present-day babies progress quickly. There are exactly k boys and k girls in the kindergarten. Some boys like some girls. But in this age the boys are still knights, so, if some boy like some girl then he likes the only girl and moreover one and the same girl can’t be liked by more than one boy. And the girls in this age are true ladies. So, if a girl likes a boy she likes the only one, and different girls like different boys.
The children are ingenuous. Their secret amorousness is well-known to the nurse. Once the group decided to go for a walk and the nurse made up her mind to fall the children in pairs so that if there is a boy or a girl in love in a pair then the boy likes his pair-mate or the girl likes the boy. Help the nurse to arrange the described pairs. You may assume that either the boys or the girls enumerated with positive integers from 1 to k.
Input
The first line contains the integer k — the number of boys (1 ≤ k ≤ 250 000). The second line consists of the numbers of girls that are liked by boys: if the i'th boy likes some girls, her number is at the i'th position; if the i'th boy likes nobody, there is 0 at the i'th position. The numbers are separated with a space. The third line consists of the analogous information about the girls.Output
You should output the sequence of k integers. The i'th element of the sequence is the number of a girl that is a pair-mate of the i'th boy. The numbers are separated with a space.Sample
input | output |
---|---|
3 3 0 0 0 2 0 | 3 2 1 |
Problem Source: USU Championship 2004
Tags: graph theory (hide tags for unsolved problems)
Difficulty: 966
题意:有n个男孩女孩,每个男孩只有至多一个喜欢的女孩,每个女孩只有至多一个喜欢的男孩。男孩喜欢的女孩互不相同,女孩喜欢的男孩互不相同。
求一个配对方案使得每一对人要么至少其中一个人喜欢对方,或两个人都没有喜欢的人。
分析:
发现这是一个每个点都只有一个出度、入度的图。
如果是环的话就随便连就好,题目保证不会有奇怪的情况。
如果不是环,就从没有人喜欢的那个人开始连。
注意奇链。
这又是ural上难度虚高的题目。
/** Create By yzx - stupidboy */ #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <deque> #include <vector> #include <queue> #include <iostream> #include <algorithm> #include <map> #include <set> #include <ctime> #include <iomanip> using namespace std; typedef long long LL; typedef double DB; #define For(i, s, t) for(int i = (s); i <= (t); i++) #define Ford(i, s, t) for(int i = (s); i >= (t); i--) #define Rep(i, t) for(int i = (0); i < (t); i++) #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--) #define rep(i, x, t) for(int i = (x); i < (t); i++) #define MIT (2147483647) #define INF (1000000001) #define MLL (1000000000000000001LL) #define sz(x) ((int) (x).size()) #define clr(x, y) memset(x, y, sizeof(x)) #define puf push_front #define pub push_back #define pof pop_front #define pob pop_back #define ft first #define sd second #define mk make_pair inline void SetIO(string Name) { string Input = Name+".in", Output = Name+".out"; freopen(Input.c_str(), "r", stdin), freopen(Output.c_str(), "w", stdout); } inline int Getint() { int Ret = 0; char Ch = ' '; bool Flag = 0; while(!(Ch >= '0' && Ch <= '9')) { if(Ch == '-') Flag ^= 1; Ch = getchar(); } while(Ch >= '0' && Ch <= '9') { Ret = Ret * 10 + Ch - '0'; Ch = getchar(); } return Flag ? -Ret : Ret; } const int N = 250010; int n, Boy , Girl ; int Fa[N * 2], Next[N * 2]; int Ans[N * 2]; inline void Input() { scanf("%d", &n); For(i, 1, n) scanf("%d", &Boy[i]); For(i, 1, n) scanf("%d", &Girl[i]); } inline void Solve() { For(i, 1, n) { if(Boy[i]) { Next[i] = Boy[i] + n; Fa[Boy[i] + n] = i; } if(Girl[i]) { Next[i + n] = Girl[i]; Fa[Girl[i]] = i + n; } } For(i, 1, 2 * n) if(!Fa[i]) { int x = i; while(Next[x] && !Ans[x]) { Ans[x] = Next[x]; Ans[Next[x]] = x; x = Next[x]; x = Next[x]; } } For(i, 1, 2 * n) if(!Ans[i]) { int x = i; while(Next[x] && !Ans[x] && !Ans[Next[x]]) { Ans[x] = Next[x]; Ans[Next[x]] = x; x = Next[x]; x = Next[x]; } } int x = n + 1; For(i, 1, n) if(!Ans[i]) { while(Ans[x]) x++; Ans[i] = x; Ans[x] = i; } For(i, 1, n - 1) printf("%d ", Ans[i] - n); printf("%d\n", Ans - n); } int main() { #ifndef ONLINE_JUDGE SetIO("B"); #endif Input(); Solve(); return 0; }
View Code
相关文章推荐
- Hbase伪分布式
- FZU5BOYS-Beta版本冲刺计划及安排
- Bootstrap历练实例:可取消的警告
- 具体支付宝接口申请流程
- 对字符串中所有指定的子串进行替换
- bios中断大全
- 《秘密》卷一:秘密-吸引力法则
- Android内存和进程的关系
- [leetcode 290] Word Pattern
- delphi 发送Windwos消息控制按钮(控制计算器里的某一个按钮)
- 第二个spring冲刺第3天
- strcpy,sprintf,memcpy的区别
- 对html文件中dom元素设置监听遇到的问题
- El Capitan cocoapods 等gem命令不能正常使用
- ural 1338. Automobiles
- Delphi XE6 试用Android视频采集
- eclipse去掉javascript校验
- find 命令
- win10
- Ubuntu 14.04 搭建LAMP