UVa 10763 - Foreign Exchange

  题目大意:留学生配对,如果甲想从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[i].s != back[i].s || go[i].e != back[i].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测试数据没考虑到吧

posted @ 2013-07-21 11:59  xiaobaibuhei  阅读(153)  评论(0编辑  收藏  举报