题目大意:留学生配对,如果甲想从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 "); 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 "); 60 else printf("NO "); 61 } 62 return 0; 63 }
由于写程序时不小心,WA了两次...无语了。看到别人说欧拉回路,考虑节点的入度和出度进行判度,虽然不对但是能AC(效率想必会比上面的提高吧),应该是OJ测试数据没考虑到吧