• POJ 2513 无向欧拉通路+字典树+并查集


    题目大意:

    有一堆头尾均有颜色的木条,要让它们拼接在一起,拼接处颜色要保证相同,问是否能够实现

    这道题我一开始利用map<string,int>来对颜色进行赋值,好进行后面的并查操作以及欧拉通路的判断,但是map效率太低,超时了

    网上看了一遍发现必须得用效率更高的字典树对每个不同的颜色进行赋值

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 #define N 500020
     6 int fa[N],degree[N],k=0;
     7 char str1[11],str2[11];
     8 struct Node{
     9     int id,cnt;
    10     Node *next[26];
    11     Node(){
    12         id=-1;
    13         for(int i=0;i<26;i++) next[i]=NULL;
    14     }
    15 };
    16 Node *root=new Node();
    17 int Insert(char *str){
    18     Node *p=root;
    19     for(int i=0;i<strlen(str);i++){
    20         if(p->next[str[i]-'a']==NULL) {Node *q=new Node();p->next[str[i]-'a']=q;}
    21         p=p->next[str[i]-'a'];
    22     }
    23     if(p->id==-1) p->id=++k;
    24     return  p->id;
    25 }
    26 int find_head(int x)
    27 {
    28     int u=x;
    29     while(x!=fa[x]) x=fa[x];
    30     fa[u]=x;
    31     return x;
    32 }
    33 int Union(int x,int y)
    34 {
    35     int fa_x=find_head(x);
    36     int fa_y=find_head(y);
    37     if(fa_x!=fa_y) fa[fa_x]=fa_y;
    38     return fa_y;
    39 }
    40 int main()
    41 {
    42     int tmp;
    43     for(int i=1;i<=500001;i++) fa[i]=i;
    44    // cout<<in[15]<<' '<<out[20]<<' '<<visit[30]<<endl;
    45     while(scanf("%s",str1)!=EOF){
    46         //if(str1[0]=='0') break;
    47         scanf("%s",str2);
    48         int a=Insert(str1);
    49         int b=Insert(str2);
    50         degree[a]++,degree[b]++;
    51         //cout<<a<<' '<<b<<endl;
    52         tmp=Union(a,b);
    53     }
    54     bool flag=1;
    55     for(int i=1;i<=k;i++){
    56         if(find_head(i)!=tmp){
    57             flag=false;
    58             break;
    59         }
    60     }
    61     if(!flag) puts("Impossible");
    62     else{
    63         int t=0;
    64         for(int i=1;i<=k;i++){
    65             if(degree[i]%2==1) t++;
    66         }
    67         if(t>2) puts("Impossible");
    68         else puts("Possible");
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    初窥Opencv
    24课时VC之思考>编辑控件
    24课时VC之思考>列表框与组合框
    递归归并排序 思想 JAVA实现
    插入排序 思想 JAVA实现
    AJAX发送json,SpringMVC 接收JSON,@RequestBody
    SpringBoot设置默认启动页的2种方式
    选择排序 思想 JAVA实现
    快速排序(一) 思想 JAVA实现
    spring security之logoutHandler中的CookieClearingLogoutHandler
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3946256.html
Copyright © 2020-2023  润新知