题意:给定一些木棒。木棒两端都涂上颜色,不同木棒相接的一边必须是
同样的颜色。求能否将木棒首尾相接。连成一条直线.
分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点
由图论知识能够知道,无向图存在欧拉路的充要条件为:
① 图是连通的。
② 全部节点的度为偶数,或者有且仅仅有两个度为奇数的结点。
图的连通性能够用并查集,由于数据比較大,所以用并查集时要压缩路径,
全部节点的度(入度和出度的和)用数组记录就好
可是25w个木棒,有50w个结点,要怎么存呢,假设用数组,每次得查找,
效率特别低,这样就能够用trie树存储数据,用空间换取时间
#include<stdio.h> #include<string.h> #include<stdlib.h> #define M 500000 typedef struct stu { int id,flag; //id为结点的编号。flag标记改颜色是否存在 struct stu *next[26]; }node; int num=1,f[M+5],d[M+5]; node* creat_node() //创建结点并初始化 { node *p=(node*)malloc(sizeof(node)); p->id=p->flag=0; memset(p->next,0,sizeof(p->next)); return p; } int trie_insert(node *p,char *s) //插入颜色结点。并返回其编号 { int i; while(*s!='