//今天下午,学一道欧拉,一道哈密尔顿。。再学一个生成树或最短路难题。。
//
//欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,
//称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
//判断欧拉路是否存在的方法
//有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
//无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
//判断欧拉回路是否存在的方法
//有向图:图连通,所有的顶点出度=入度。
//无向图:图连通,所有顶点都是偶数度。
//程序实现一般是如下过程:
//
//1.利用并查集判断图是否连通,即判断可以作为起点的点的个数,如果大于1,说明不连通。
//2.根据出度入度个数,判断是否满足要求。
//3.利用dfs输出路径。
//他还要用字典树
过了。。还是要去写难题呀。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define maxn 600000
using namespace std;
int color;
int fa[maxn];
class Tree_node
{
public:
Tree_node *next[27];
bool flag;
int id;
Tree_node()
{
memset(next,0,sizeof(next));
flag=0;
id=0;
}
}root;
int Hash(char *s)
{
int len=0;
Tree_node *p=&root;
while(s[len]!='\0')
{
int index=s[len++]-'a';
if(!p->next[index])
{
p->next[index]=new Tree_node;
}
p=p->next[index];
}
if(p->flag==false)
{
p->flag=true;
p->id=color++;
}
return p->id;
}
int Find(int x)
{
if(fa[x]==-1) return x;
else return fa[x]=Find(fa[x]);
}
int Union(int a,int b)
{
int ra=Find(a);
int rb=Find(b);
if(ra!=rb)
{
fa[ra]=rb;
return true;
}
return false;
}
int du[maxn];
int main()
{
// freopen("input.txt","r",stdin);
color=0;
memset(du,0,sizeof(du));
memset(fa,-1,sizeof(fa));
char a[100],b[100];
while(scanf("%s%s",&a,&b)!=EOF)
{
// cout<<"miao"<<endl;
int ida=Hash(a);int idb=Hash(b);
du[ida]++;
du[idb]++;
// cout<<ida<<" "<<idb<<endl;
Union(ida,idb);
}
// for(int i=0;i<color;i++)
// cout<<Find(i)<<endl;
int ans=Find(0);
bool flag=true;
for(int i=1;i<color;i++)
{
if(Find(i)!=ans)
{
flag=false;break;
}
}
// cout<<flag<<endl;
int res=0;
for(int i=0;i<color;i++)
{
if(du[i]%2==1)
res++;
}
if(!(res==2 || res==0))
flag=false;
if(flag) cout<<"Possible"<<endl;
else cout<<"Impossible"<<endl;
}
POJ 2513 欧拉路
最新推荐文章于 2019-11-03 09:30:52 发布