poj2531(trie + 欧拉路径判定)
2015-09-23 21:37
323 查看
思路:这问题显然是要判断欧拉路径的存在,然后要把串看成一个点,然后统计串的种类(trie树),最后就是并查集来判断连通性 + 度的判断(无向图的欧拉路径 == 度为奇数的点的个数要么为0,要么为2,不然不存在欧拉路径,这个是一个充要条件)
点击题目链接
点击题目链接
/***************************************** Author :Crazy_AC(JamesQi) Time :2015 File Name : *****************************************/ // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <limits.h> using namespace std; #define MEM(a,b) memset(a,b,sizeof a) typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; struct node{ int val; node* nxt[26]; }*rt,memery[5100050]; int F[510005],deg[510005],cnt,ant; node *newnode(){ node *p = &memery[ant++]; for (int i = 0;i < 26;i++){ p->nxt[i] = NULL; } return p; } void insert(char *s,int x){ node* p = rt; for (int i = 0;s[i];i++){ int k = s[i] - 'a'; if (p->nxt[k] == NULL){ p->nxt[k] = newnode(); } p = p->nxt[k]; } p->val = x; } int search(char *s){ node *p = rt; for (int i = 0;s[i];i++){ int k = s[i] - 'a'; if (p->nxt[k] == NULL) return 0; p = p->nxt[k]; } return p->val; } void init(){ for (int i = 1;i <= 510000;i++) F[i] = i; MEM(deg, 0); cnt = 0; } int Find(int x){ if (x == F[x]) return x; else return F[x] = Find(F[x]); } void Union(int x,int y){ F[x] = y; } bool Judge(){ int odd = 0; for (int i = 1;i <= cnt;i++){ if (deg[i] & 1) odd++; } if (odd != 0 && odd != 2) return false; int k = Find(1); for (int i = 2;i <= cnt;i++){ if (k != Find(i)) return false; } return true; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); init(); rt = newnode(); char s1[15],s2[15]; while(scanf("%s %s",s1,s2) != EOF){ int x = search(s1); int y = search(s2); if (x == 0) insert(s1,x = ++cnt); if (y == 0) insert(s2,y = ++cnt); deg[x]++; deg[y]++; int t1 = Find(x); int t2 = Find(y); if (t1 != t2) Union(t1,t2); } if (Judge()) printf("Possible\n"); else printf("Impossible\n"); return 0; }
相关文章推荐
- YARN工作流程
- GDB使用教程
- BZOJ 1878: [SDOI2009]HH的项链 离线树状数组
- Oracle_JDBC操作指令和代码例子
- [leetcode54] Spiral Matrix
- iOS-Core-Animation-Advanced-Techniques(四-2)
- 网络游戏服务器端架构设计
- Android对话框
- 2015年秋季个人阅读计划
- java13 InputStream,Reader
- Office2010 pro附+激活工具
- [HW] OJ记录20题之四
- 数字转换成字符串进行连接
- 解决重新安装MySQL无法 start service的问题
- 验证码
- html5
- C++利用结构
- map 用法。
- 支付宝分布式事务文章
- 最小生成树算法Prim、Kruskal