文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>poj2337 Catenyms

poj2337 Catenyms

时间:2011-04-28  来源:yuecxl

第一次写欧拉路,有点郁闷,不过知道了,欧拉的判定是否可以用并查集哦,这题是纯模板的

#include"stdio.h"
#include"math.h"
#include"string.h"
#include"stdlib.h"

typedef struct node
{
        int from,to,vis;
        
}Node;
Node map[1001];
char str[1001][21],str1[1001][21];
int po[27];
int m,n,e;

int cmp(const void *a,const void *b)
{
        return strcmp((char *)a,(char *)b);
}

int find(int x)
{
        int i,j;
        i = x;
        while(x!=po[x])x = po[x];
        
        while(i!=x)
        {
                j     = po[i];
                po[i] = x;
                i     = j;
        }
        return x;
}

void eurlar(int u)
{
        int i;
        
        for(i=1;i<=e;i++)
        {
                if(!map[i].vis && map[i].from==u)
                {
                        map[i].vis = 1;
                        eurlar(map[i].to);
                        strcpy(str1[++n],str[i]);
                }
        }
}

int main()
{
        int text,i,j,k,len,a,b,a1,a2,in[27],out[27],us[27];
        
        scanf("%d",&text);
        while(text--)
        {
                scanf("%d",&e);
                if(e<3){printf("***");printf("\n");continue;}
                for(i=1;i<=26;i++)po[i] = i;
                for(i=1;i<=26;i++)in[i] = out[i] = us[i] = 0;
                for(i=1;i<=e;i++)
                {
                        scanf("%s",str[i]);
                }
                qsort(str+1,e,sizeof(str[0]),cmp);
                //for(i=1;i<=e;i++)printf("%d %s\n",i,str[i]);
                for(i=1;i<=e;i++)
                {
                        len = strlen(str[i]);
                        a = str[i][0]-'a'+1;
                        b = str[i][len-1]-'a'+1;//printf("a = %d b = %d \n",a,b);
                        a1= find(a);//并查集
                        a2= find(b);
                        po[a1] = a2;
                        map[i].from = a;
                        map[i].to   = b;
                        map[i].vis  = 0;
                        us[a]       = 1;
                        us[b]       = 1;                    
                        out[a]++;
                        in[b]++;
                }
                a = b = 0;
                for(i=1;i<=26;i++)//是不是在一棵树内
                {//printf("i = %d  po[] = %d us= %d\n",i,po[i],us[i]);
                        if(i==po[i] && us[i])b++;
                }//printf("b = %d\n",b);
                if(b>1)
                {
                        printf("***");
                        printf("\n");
                        continue;
                }
                a = b = 0;
                for(i=1;i<=26;i++)//入度和出度是否相等,且至多有一对差1
                {
                        if(in[i]==out[i])continue;//{printf("in=%d,out=%d\n",in[i],out[i]);continue;}
                        else if(in[i]-1==out[i])a++;
                        else if(in[i]+1==out[i])b++;
                        else break;
                }//printf("i =%d,a=%d,b=%d\n",i,a,b);
                if(i<=26 || a!=b || a>1 || b>1)
                {
                        printf("***\n");
                        continue;
                }
                n = 0;
                a1 = 1;
                
                if(a==1)//这是很严重的问题,当是欧拉路对时候,要找到原点,不然结果只是wa
                {
                        for(i=1;i<=e;i++)
                        {
                                if(out[map[i].from]-in[map[i].from]==1)//找到起点
                                {
                                        a1 = i;
                                        break;
                                }
                        }
                }
                eurlar(map[a1].from);
                for(i=n;i>=1;i--)
                {
                        printf("%s",str1[i]);
                        if(i>1)printf(".");
                }
                printf("\n");
        }
        return 0;
}
相关阅读 更多 +
排行榜 更多 +
无限Fps

无限Fps

飞行射击 下载
幸存者时间僵尸

幸存者时间僵尸

飞行射击 下载
金属兄弟Metal Brother

金属兄弟Metal Brother

冒险解谜 下载