POJ 2513-Colored Sticks (字典树)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:25   2510   0

题目链接:http://poj.org/problem?id=2513

题意:给你n个木棒,每个木棒两端各有一种颜色,两个木棒能连在一起当且仅当两个木棒有相同的一种颜色,问你这n个木棒能否连在一起。。

题解:首先需要判断能否构成欧拉回路,判断的方法很简单,判断每个木棒两端的的颜色出现多少次即可,假如有出现颜色的度为奇数次的话,只能出现两个,否则必不能构成欧拉回路,剩下的就是给每种颜色一个编号即可,字典树跑一发。

PS:这道题是去年就写过的题,只是想换种姿势搞一搞。。。。

#include<map>    
#include<stack>    
#include<queue>    
#include<vector>    
#include<math.h>    
#include<stdio.h>    
#include<iostream>    
#include<string.h>    
#include<stdlib.h>    
#include<algorithm>    
using namespace std;    
typedef long long  ll;    
#define inf 100000000000    
#define mod 1000000007     
#define  maxn  530010    
#define  lowbit(x) (x&-x)    
#define  eps 1e-10   
int degree[maxn],size=1,fa[maxn],cnt[maxn][27],vis[maxn],color;
char s1[20],s2[20];
int insert(char a[])
{
 int u=0,len=strlen(a),i;
 for(i=0;i<len;i++)
 {
  int v=a[i]-'a';
  if(!cnt[u][v])
  {
   vis[size]=0;
   cnt[u][v]=size++;
  }
  u=cnt[u][v];
 }
 if(!vis[u])
  vis[u]=++color;
 return vis[u];
}
int find(int x)
{
 if(fa[x]==x)
  return x;
 return fa[x]=find(fa[x]);
}
int main(void)
{
 int  i,ans=0;
 for(i=0;i<maxn;i++)
  fa[i]=i,degree[i]=0;
 while(scanf("%s%s",s1,s2)!=EOF)
 {
  int t1=insert(s1);
  int t2=insert(s2);
  degree[t1]++;degree[t2]++;
  int f1=find(t1),f2=find(t2);
  if(f1!=f2)
   fa[f1]=f2;
 }
 for(i=1;i<=color;i++)
 {
  if(degree[i]%2==1)
   ans++;
  if(ans>2 || find(1)!=find(i))
  {
   printf("Impossible\n");
   return 0;
  }
 }
 if(ans==1)
  printf("Impossible\n");
 else
  printf("Possible\n");
 return 0;
}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP