|
题目大意:留学生配对,如果甲想从A去B,乙想从B去A,则甲乙能完成配对。现在给出n个留学生,判断能否完全配对。
最开始考虑用个二维数组维护信息,不过题中数据可达500000,不可能开那么大的二维数组,只好通过排序进行处理了。
1 #include <cstdio>
2 #include <algorithm>
3 #define MAXN 500000+10
4 using namespace std;
5
6 struct Route
7 {
8 int s, e;
9 };
10
11 Route go[MAXN], back[MAXN];
12
13 bool cmp(const Route &a, const Route &b)
14 {
15 if (a.s != b.s) return a.s < b.s;
16 return a.e < b.e;
17 }
18
19 int main()
20 {
21 #ifdef LOCAL
22 freopen("in", "r", stdin);
23 #endif
24 int n;
25 while (scanf("%d", &n) != EOF && n)
26 {
27 int g_cnt = 0, b_cnt = 0;
28 for (int i = 0; i < n; i++)
29 {
30 int x, y;
31 scanf("%d%d", &x, &y);
32 if (x < y)
33 {
34 go[g_cnt].s = x;
35 go[g_cnt].e = y;
36 g_cnt++;
37 }
38 else
39 {
40 back[b_cnt].s = y;
41 back[b_cnt].e = x;
42 b_cnt++;
43 }
44 }
45 if (g_cnt != b_cnt)
46 {
47 printf("NO\n");
48 continue;
49 }
50 sort(go, go+g_cnt, cmp);
51 sort(back, back+b_cnt, cmp);
52 bool yes = true;
53 for (int i = 0; i < g_cnt; i++)
54 if (go.s != back.s || go.e != back.e)
55 {
56 yes = false;
57 break;
58 }
59 if (yes) printf("YES\n");
60 else printf("NO\n");
61 }
62 return 0;
63 }
View Code 由于写程序时不小心,WA了两次...无语了。看到别人说欧拉回路,考虑节点的入度和出度进行判度,虽然不对但是能AC(效率想必会比上面的提高吧),应该是OJ测试数据没考虑到吧 |
|
|