zoukankan      html  css  js  c++  java
  • pku 2513 Colored Sticks

    唉,总算是过了,很无语呀,本来想改改,看效率能否提高一点,可是改来改去还是快不了多少,反而因为一些小错误多了几次WA

    这题用字典树还有并查集做,至于判断欧拉路之前已经说过了,只需要判断连通 && 所以节点的度为偶数 或者只有俩个节点的度为奇数‘

    用并查集主要是判断是否连通

    用字典树是为了给读入的字符串编号(这一步也就是跟之前pku 1386 唯一的区别吧)

    本题特别要注意的是一点就是,有空数据,唉…………

    #include<iostream>
    #include<string>
    #define MAXN 500100
    using namespace std;
    int f[MAXN],n,d[MAXN];
    //f[]记录每个节点的父节点,d[]记录节点的度数,n累加求出不同节点的个数
    typedef struct node  
    {  
        int cnt;  
        struct node *next[26]; 
    }*tree,Trie;  
    tree root; 
    void init()
    {
    	for(int i=0;i<MAXN;i++)
    		f[i]=i;
    	memset(d,0,sizeof(d));
    }
    inline int GetNum(char *t){
    	tree p = root,newnode;
    	for(int i = 0;i < strlen(t); ++i){
    		int u = t[i] - 'a';
    		if(p->next[u]==NULL)
    		{	
    			newnode=(tree)malloc(sizeof(Trie));
    			newnode->cnt=-1;
    			for(int j=0;j<26;j++)
    				newnode->next[j]=NULL;
    			p->next[u]=newnode;
    			p=newnode;
    		}
    		else
    		p = p->next[u];
    	}
    	if(p->cnt == -1) //该节点未出现过
    		p->cnt = n ++;
    	return p->cnt;
    }
    inline int find(int x)
    {
    	if(x==f[x])
    		return f[x];
    	 f[x]=find(f[x]);
    	 return f[x];
    }
    inline void Union(int x,int  y)
    {
    	int a=find(x);
    	int b=find(y);
    	if(a==b)
    		return ;
    	f[b]=a;
    }
    int main()
    {
    	char str1[11],str2[11];n=0;
    	root=(tree)malloc(sizeof(Trie));
    	root->cnt=-1;
    	for(int j=0;j<26;j++)
    	  root->next[j]=NULL;
    	init();
    	while(scanf("%s %s",str1,str2)==2)
    	{
    	//	if(!strcmp(str1,"0")) break;
    		int v=GetNum(str1);
    		int w=GetNum(str2);
    	//	cout<<v<<' '<<w<<endl;
    		d[v]++;
    		d[w]++;
    		Union(v,w);
    	}
    	int num=0,x=find(0);
    	//倘若没进入循环,则num默认为0,这是用来判断空数据用的,输出Possible
    	  for(int i=0;i<n;i++)
    	  {
    		 if(d[i]&1)//累加奇度数的节点
    			 num++;	  
    		 if(x!=find(i))//根节点不止一个,即不连通
    		 {
    			 num=-1;
    			 break;
    		 }
    	  }
    	  if(num==0||num==2)
    		  printf("Possible\n");	
    	   else printf("Impossible\n");
    	return 0;
    }
    
    	
    
    
    
    
    
    
  • 相关阅读:
    Vue.js的组件化思想--下
    Vue.js的组件化思想--上
    Git常用命令总结
    vue基础语法
    ES6基础语法
    Vue笔记
    Vue的基本使用(一)
    es6的基本用法
    Django-admin管理工具
    Django组件-中间件
  • 原文地址:https://www.cnblogs.com/nanke/p/2129370.html
Copyright © 2011-2022 走看看