歐拉路+字典樹 poj2513 Colored Sticks

這題真卡空間==

這道題就是判斷是否圖中有歐拉路,判斷圖是否聯通

歐拉路:圖中度數爲奇數的點爲0或者2

判斷圖是否連通,直接dfs遍歷一次圖就行了

但是這道題輸入的是25w string 用map會t的

我們要用到字典樹

我的字典樹模板

int newnode(){

for(int i=0;i<27;i++){

nxt[l][i] = -1;

}

l++;

return l-1;

}

void init(){

l = 0, root = 0;

newnode();

}

int insert(char a[]){
int len = strlen(a);
int now = root;
for(int i=0;i<len;i++){
int t = a[i]-'a';
if(nxt[now][t] == -1){
nxt[now][t] = newnode();
}
now = nxt[now][t];

}
}


代碼入下

/********************************************
Author         :Crystal
Created Time   :
File Name      :
********************************************/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
#define MEM(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a);
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
//#define LOCAL
struct node
{
	/* data */
	int u,v;
}a[500050];
int t = 0;
int cnt = 0;
int degree[500050];
int pnt[500050],head[500050],nxt[500050];
bool vis[500050];
int Nxt[550000][27];
int ans[550000][27];
int l = 0,root = 0;
int newnode(){
    for(int i=0;i<27;i++){
        Nxt[l][i]=-1;
    }
    l++;
    return l-1;
}
int insert(char a[]){
	int len = strlen(a);
	int now = root;
	int res = 0;
	for(int i=0;i<len;i++){
		int t = a[i]-'a';
		if(Nxt[now][t] == -1){
			Nxt[now][t] = newnode();
		}
		res = now;
		now = Nxt[now][t];	
	}
	if(len == 0)return 1;
	if(ans[res][a[len-1]-'a']){
		return ans[res][a[len-1]-'a'];
	}
	else{
		return ans[res][a[len-1]-'a'] = ++cnt;
	} 
}
void addedge(int u,int v){
	pnt[t] = v;
	nxt[t] = head[u];
	head[u] = t++;
}
void dfs(int u){
	vis[u] = 1;
	for(int i=head[u];i!=-1;i=nxt[i]){
		int v=pnt[i];
		if(!vis[v]){
			dfs(v);
		}
	}
}
int main()
{
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	MEM(head,-1);
	int ver = 0;
	char aa[20];
	char bb[20];
	newnode();
	while(scanf("%s%s",aa,bb)!=EOF){
		a[ver].u = insert(aa);
		a[ver].v = insert(bb);
		ver++;
	}
	for(int i=0;i<ver;i++){
		degree[a[i].u]++;
		degree[a[i].v]++;
		addedge(a[i].u,a[i].v);
		addedge(a[i].v,a[i].u);
	}
	dfs(1);
	int ccnt = 0;
	int even = 0;
	for(int i=1;i<=cnt;i++){
		if(vis[i])ccnt++;
		if(degree[i]%2){
			even++;
		}
	}
	if(ccnt == cnt){
		if(even == 0 || even == 2){
			cout <<"Possible\n";
		}
		else cout <<"Impossible\n";
	}	
	else cout << "Impossible\n";
	return 0;
}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章