POJ 2513-Colored Sticks(連線木棍-trie樹+並查集+尤拉通路)
Colored Sticks
Time Limit: 5000MS | Memory Limit: 128000K | |
Total Submissions: 37049 | Accepted: 9729 |
Description
You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line such that the colors of the endpoints that touch are of the same color?
Input
Input is a sequence of lines, each line contains two words, separated by spaces, giving the colors of the endpoints of one stick. A word is a sequence of lowercase letters no longer than 10 characters. There is no more than 250000 sticks.
Output
If the sticks can be aligned in the desired way, output a single line saying Possible, otherwise output Impossible.
Sample Input
blue red red violet cyan blue blue magenta magenta cyan
Sample Output
Possible
Hint
Huge input,scanf is recommended.
Source
題目意思:
有一堆木棍, 木棍的兩個端點用一些不同的顏色著色, 將它們在端點處連線起來,要求端點的顏色相同,判斷是否能夠實現。
解題思路:
啊(○´・д・)ノ本來以為要用這麼多知識點就很困難,結果好像…(⊙v⊙)嗯直接用尤拉回路判斷的充要條件還是很簡單的。
將不同的顏色視為圖的節點,木棍本身視為邊,建圖。
資料量巨大,map妥妥超時,用trie樹儲存記錄不同顏色的序號,並查集判斷是否只有一個父節點(這種情況下圖才是連通的),若滿足題設條件,則圖中必然存在尤拉通路。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 510010
#define INF 0x3f3f3f3f
int trie[MAXN][26];//字典樹
int num[MAXN][26];//顏色的序號
int degree[MAXN],fa[MAXN];//顏色出現的次數、並查集
int n,e;//樹的數目和序號
//字典樹
int Insert(char s[])
{
int j=0;
int len=strlen(s);
for(int i=0; i<len; i++)
if(trie[j][s[i]-'a']) j=trie[j][s[i]-'a'];
else
{
trie[j][s[i]-'a']=++e;
j=trie[j][s[i]-'a'];
}
if (num[j][s[len-1]-'a']==0) //當前字母沒有出現過
num[j][s[len-1]-'a']=++n;
return num[j][s[len-1]-'a'];//顏色的序號
}
//並查集
int Find(int x)
{
if(x!=fa[x]) fa[x]=Find(fa[x]);
return fa[x];
}
void Join(int i,int j)
{
int p=Find(i);
int q=Find(j);
if(p!=q) fa[p]=q;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("G:/cbx/read.txt","r",stdin);
//freopen("G:/cbx/out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
n=e=0;
memset(trie,0,sizeof(trie));
memset(num,0,sizeof(num));
memset(degree,0,sizeof(degree));
for(int i=1; i<MAXN; i++)
fa[i]=i;
char s1[11],s2[11];
while(cin>>s1>>s2)
{
int p=Insert(s1),q=Insert(s2);//插入字典樹,得到顏色的序號
++degree[p],++degree[q];//更新度數
Join(p,q);
}
int cnt=0;//父節點的個數
for(int i=1; i<=n; i++)//是否只有一個父節點
{
if(i==Find(i)) ++cnt;
if (cnt>1) break;
}
if (cnt>1) cout<<"Impossible"<<endl;//只有一個父節點時是不連通的
else
{
int sum=0;
for(int i=1; i<=n; i++)
if (degree[i]%2) ++sum;//統計度為奇數的點的個數
if(sum==0||sum==2) cout<<"Possible"<<endl;//無向圖尤拉回路中度為奇數的點的個數是0/2
else cout<<"Impossible"<<endl;
}
}
相關文章
- POJ2492(種類並查集)並查集
- POJ 1308-Is It A Tree?(並查集)並查集
- 【POJ 1182】食物鏈(並查集)並查集
- POJ1797 Heavy Transportation【並查集+貪心】並查集
- POJ 1703-Find them, Catch them(並查集)並查集
- POJ 2492 A Bug's Life(關係並查集)並查集
- POJ 1733 Parity【擴充套件域並查集】套件並查集
- POJ2253 Frogger【並查集+貪心】並查集
- POJ 2492-A Bug's Life(帶權並查集)並查集
- POJ 2236-Wireless Network(並查集)並查集
- POJ 2524-Ubiquitous Religions(入門並查集)UI並查集
- POJ 1703 Find them, Catch them (關係並查集)並查集
- poj 1182 並查集經典問題並查集
- 線段樹也能是 Trie 樹 題解
- BZOJ 3673 可持久化並查集 by zky 可持續化線段樹+並查集啟發式合併持久化並查集
- POJ-1182-食物鏈(並查集種類)並查集
- Trie樹,字典樹
- 樹(tree) - 題解(帶權並查集)並查集
- POJ 1611-The Suspects(並查集-同一集合)並查集
- 佈線問題_ny_38(並查集+最小生成樹).java並查集Java
- poj 2478 尤拉函式函式
- 字典樹(Trie)
- poj 3764 最長異或路徑(二進位制trie樹)
- 並查集到帶權並查集並查集
- hihocoder trie 樹
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- POJ 2492 A bug's life【擴充套件域 | 邊帶權並查集】套件並查集
- POJ 1182(食物鏈-另類做法【拆點】)[Template:並查集]並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- hdu4313 貪心並查集 || 樹形dp並查集
- POJ 2777-Count Color(線段樹-區間染色查詢)
- 使用 Phoenix-4.11.0連線 Hbase 叢集 ,並使用 JDBC 查詢測試JDBC
- 序列並查集的線性演算法並查集演算法
- POJ 1182 食物鏈【擴充套件域 | 邊帶權並查集】套件並查集
- 並查集(一)並查集的幾種實現並查集
- 尤拉計劃425題:質數連線
- 並查集(小白)並查集
- 3.1並查集並查集