在分配内存上的两种写法:
写法一:(new申请)
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=500005;
int color=0;
int bin[MAXN];
int indegree[MAXN]= {0};
struct Tree_node
{
int id;
bool flag;
Tree_node *next[27];
Tree_node()
{
id=0;//表示颜色的序号,每种颜色只有一个序号
flag=false;//标记是否有此种颜色
memset(next, 0 ,sizeof(next));
}
} root;
int findx(int x)
{
/*while(bin[x]!=x)
{
bin[x]=bin[bin[x]];
x=bin[x];
}
return x;
time:1329ms;
*/
if(bin[x]!=x)
return bin[x]=findx(bin[x]);
return bin[x];
time:1235ms;
/*
return bin[r]==r?r:findx(bin[r]);
time:1313ms;
*/
}
void megre(int x, int y)
{
int fx = findx(x);
int fy = findx(y);
if(bin[fy]!=fx)
bin[fy]=fx;
}
int Hash(char *str)
{
int len=0;
Tree_node *p=&root;
while(str[len]!='\0')
{
int index=str[len++]-'a';
if(p->next[index]==NULL)//如果指针域为空,申请空间
{
p->next[index] = new Tree_node;// 申请一个Tree_node类型的内存空间
}
p=p->next[index];
}
if(p->flag)
return p->id;//之前已记录过次颜色
else
{
p->flag=true;
p->id=++color;
return p->id;
}
}
int main()
{
char s1[15], s2[15];
for(int i=1; i<=MAXN-1; ++i)
bin[i]=i;
while(~scanf("%s %s", s1, s2))
{
int a = Hash(s1);
int b = Hash(s2);
indegree[a]++;
indegree[b]++;//记下度数,利用欧拉路的性质,判断能否构成回路
megre(a,b);
}
int num=0;
int s=findx(1);
for(int i=1; i<=color; ++i)
{
if(indegree[i]%2)
num++;
if(findx(i)!=s||num>2)//根不一样,说明不连通,无法一笔画 或者 无法构成欧拉路,
//判断是否存在欧拉通路或回路抓住两点就行了,第一是图连通,第二是奇数度结点只能有0个(回路)或2个(通路)
{
printf("Impossible\n");
return 0;
}
}
if(num==1)
printf("Impossible\n");
else//只有num==2或0的时候才有可能
printf("Possible\n");
return 0;
}
写法二:(malloc申请)
#include<iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAXN=500005;
int color=0;
int bin[MAXN];
int indegree[MAXN]= {0};
typedef struct Tree_node
{
int id;
bool flag;
Tree_node *next[27];
}node, *npivot;
int findx(int r)
{
return bin[r]==r?r:findx(bin[r]);
}
void megre(int x, int y)
{
int fx = findx(x);
int fy = findx(y);
if(bin[fy]!=fx)
bin[fy]=fx;
}
int Hash(npivot root, char *str)
{
int len=0;
npivot p=root;
while(str[len]!='\0')
{
int index=str[len++]-'a';
if(p->next[index]==NULL)
{
p->next[index] = (npivot)malloc(sizeof(node));
p->next[index]->flag=0;
memset(p->next[index]->next,0,sizeof(p->next[index]->next));
}
p=p->next[index];
}
if(p->flag)
return p->id;
else
{
p->flag=true;
p->id=++color;
return p->id;
}
}
int main()
{
char s1[15], s2[15];
for(int i=1; i<=MAXN-1; ++i)
bin[i]=i;
npivot root = (npivot)malloc(sizeof(node));
root->flag=0;
memset(root->next,0, sizeof(root->next));
while(~scanf("%s %s", s1, s2))
{
int a = Hash(root, s1);
int b = Hash(root, s2);
indegree[a]++;
indegree[b]++;
megre(a,b);
}
int num=0;
int s=findx(1);
for(int i=1; i<=color; ++i)
{
if(indegree[i]%2)
num++;
if(findx(i)!=s||num>2)
{
printf("Impossible\n");
return 0;
}
}
if(num==1)
printf("Impossible\n");
else
printf("Possible\n");
return 0;
}