poj2513Colored Sticks(无向图的欧拉回路)

/*
   题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同!
   思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路

   并查集判通 + 奇度节点个数等于2或者0
*/
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 2500005*2
using namespace std;

int f[N];
int trie[N][26];
int rank[N];
int deg[N]; 

int getFather(int x){
   return x==f[x] ? x : f[x]=getFather(f[x]);
} 

void Union(int a, int b){
    int fa=getFather(a), fb=getFather(b);
    if(fa!=fb){
        if(rank[fa]>rank[fb]){
           rank[fa]+=rank[fb]+1;
           f[fb]=fa;
        }
        else{
            f[fa]=fb;
            rank[fb]+=rank[fa]+1;
        }
    }
} 

int main(){
   int cnt=0, c=0, cur=0;
   int u, v;
   char ch[15];
   for(int i=1; i<N; ++i)
      f[i]=i;
   while(scanf("%s", ch)!=EOF){
       ++c;
       cur=0;
       for(int i=0; ch[i]; ++i){
           if(!trie[cur][ch[i]-'a'])
              trie[cur][ch[i]-'a']=++cnt;
           cur=trie[cur][ch[i]-'a'];
       }
       if(c&1)  u=cur;
       else v=cur;

       if((c&1)==0){
          Union(u, v);
          ++deg[u];
          ++deg[v];
      }
   }
   int rootN=0, degN=0;
   for(int i=1; i<=cnt; ++i){
         if(deg[i] && f[i]==i) ++rootN;
         if(deg[i]&1) ++degN;
         if(rootN>1 || degN>2) break;
   }
   if(rootN==1 && (degN==0 || degN==2) || rootN==0 && degN==0)
       printf("Possible\n");
   else printf("Impossible\n");
   return 0;
}
时间: 2024-10-01 03:45:38

poj2513Colored Sticks(无向图的欧拉回路)的相关文章

POJ2513-Colored Sticks

+ View Code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354/*<br>思路:类似图论中"一笔画"问题,两根木棒的相连接的端点是一样的颜色,(a,b)--(b,c)--(c, d)....<br>方法:trie树+并查集, 利用trie树建立字符串和某一个节点的映射,并将这些和字符串构成映射的节点建成图

UVa 10054:The Necklace, 欧拉回路+打印路径

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=995 题目类型: 欧拉回路 题目: My little sister had a beautiful necklace made of colorful beads. Two successive beads in the necklace sha

poj 1386 Play on Words(有向图欧拉回路)

/* 题意:单词拼接,前一个单词的末尾字母和后一个单词的开头字母相同 思路:将一个单词的开头和末尾单词分别做两个点并建一条有向边!然后判断是否存在欧拉回路或者欧拉路 再次强调有向图欧拉路或欧拉回路的判定方法: (1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度. (2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1.v的入度比出度小1, 其它所有顶点的入度等于出度(顶点u,v的个数必须都是1). 求该图的连通性的时候,只

hdu 1878 欧拉回路

点击打开链接hdu 1878 思路: 欧拉回路 分析: 1 首先题目给定的是一个无向图,所以我们判断该图是欧拉图的条件是图是否是连通的并且所有点的度都是偶数 2 很明显度数很好判断,而图是否连通通过并查集 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 1010; int fa

欧拉回路

欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉路是否存在的方法   有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度. 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的. 定理:无向图G具有一条欧拉路,当且仅当G是连通的,且有0个或者是两个奇数度得结点.   推论:无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度

请教各位算法大神,acm一道题:赋权无向图的最小权值遍历用什么算法(存在负权值)?

问题描述 请教各位算法大神,acm一道题:赋权无向图的最小权值遍历用什么算法(存在负权值)? 1C 如题,问题是这样的:有一赋权无向连通图,可以从任意一结点出发,求遍历所有结点的最小权值路线.结束点也是任意的,每个节点也没有访问次数的限制,但必须每个节点都要被访问到.,想问一下用什么算法呢? 解决方案 可以参考djstera算法,求最短路径~借鉴其中的标记功能,只不过结束状态标志是所有节点均已遍历. 解决方案二: 可以参考djstera算法,求最短路径~借鉴其中的标记功能,只不过结束状态标志是所

用java建立无向图,然后进行深度和广度遍历,下列的代码怎么改

问题描述 用java建立无向图,然后进行深度和广度遍历,下列的代码怎么改 import java.util.LinkedList;import java.util.Queue;class MatrixUDG { static int vlen; int elen; int[][] mMatrix; char[] mVexs; private int number = 7; private boolean[] flag; int[][] edges; MatrixUDG(char[] vexs c

算法-C/C++杭电1501题Wooden sticks 求挑错

问题描述 C/C++杭电1501题Wooden sticks 求挑错 DescriptionThere is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time called setup

浅谈算法和数据结构 十二 无向图相关算法基础

从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记. 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图. 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅由两个顶点连接,并且没有方向的图称为无向图. 在研究图之前,有一些定义需要明确,下图中表示了图的一些基本属性的含义,这里就不多说明. 图的