Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这

些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色都是相同的,给出每根木棍两端

的颜色,请问是否存在满足要求的排列方式。

  例如,如果只有2根木棍,第一根两端的颜色分别为red,blue,第二根两端的颜色分别为red,yellow,

那么blue---red|red----yellow便是一种满足要求的排列方式。

【输入格式】

输入有若干行,每行包括两个单词,表示一根木棍两端的颜色,单词由小写字母组成,且单词长度不会超过10个字母,最多有250000根木棍。

【输出格式】

如果木棒能够按要求排列,输出Possible,否则输出Impossible

Sample Input1

blue red
red violet
cyan blue
blue magenta
magenta cyan

Sample Output1

Possible
【题解】
考的是hash函数。这里我们不去构造hash函数。而用字典树的方法来实现hash。即将单词这样的字符串转换为int类型。便于我们用下标访问。然后用木棍的信息建立一张图。即一根木棍就是一条边。然后需要连接起来。它的条件就是。这整张图为欧拉图。也就是一笔画。然后判断的方法是。
1.图是联通的。
2.统计所有的点的出度。如果出度全部为偶数或者恰好只有两个点为奇数。则可以一笔画。则能够把所有的木棍都连接起来。
//联通的话用并查集也可以。用dfs从任意一个点进行搜索然后看下能不能走到所有的点。也可以。但是推荐用dfs,因为可以一边统计出度信息。
然后如果不想打字典树。还有一种方法。就是把边的信息记录下来(记录的时候,两个字符串进行一下比较,小的放前面)。然后对边的信息进行排序。以边的左端点作为关键字排序。然后左端点相同的边就会紧邻在一起。我们把字符串编号一下就可以,然后还是一样建图即可。。
【代码】
#include <cstdio>
#include <cstring> struct tree//用字典树的方法来获取某个单词的hash值。
{
int hash;
int next[27];
}; int tot = 0, ne[500001], first[500001], en[500001], totm = 0, chudu[500001] = { 0 },temp_tot,tot_v=1;
//用邻接表来存储图的信息。
bool visited[500001] = { 0 };
tree a[800001]; //用数组来模拟链表。 int sear_ch(char s[50])//用字典树。来获取s这个字符串对应的hash值。
{
int l = strlen(s);//获取字符串的长度。
int p = 1;//从根节点开始往下走
for (int i = 1; i <= l; i++)
{
int x = s[i - 1] - 'a' + 1;//把小写字母和数字1..26对应
if (a[p].next[x] == 0)//如果这个节点不存在。则新建一个节点、
{
tot_v++;
a[p].next[x] = tot_v;
}
p = a[p].next[x];//一直往下走。
}
if (a[p].hash == 0)//如果这条路径(这个字符串)之前没人走过,则给其一个新的hash值
a[p].hash = ++tot;
return a[p].hash;//然后直接返回这个值就可以了。。
} void add(int x, int y)//加一条从x指向y的边
{
totm++;
ne[totm] = first[x];//邻接表用的是链式存储的方式。
first[x] = totm;
en[totm] = y;
} void dfs(int now)//这个程序会从最后一个点开始进行dfs看一下能不能走遍所有的点。
{
temp_tot--;//找到了一个点,点的数目就减少。最后看temp_tot是否为0
visited[now] = true;
int temp = first[now];
while (temp != 0)//用邻接表来获取这个点的出度。
{
chudu[now]++;//顺便记录出度
int y = en[temp];
if (!visited[y])//如果没有访问过就访问。
dfs(y);
temp = ne[temp];//寻找下一个出度
}
} int main()
{
char s1[50], s2[50];
while (scanf("%s%s", s1, s2) != -1)//多行输入
{
int x, y;
x = sear_ch(s1);
y = sear_ch(s2);
add(x, y);
add(y, x);
}
temp_tot = tot;//用来递减的temp
if (tot>0) //如果什么都没输入也算是可以的。
dfs(tot);
if (temp_tot != 0)//如果图是不连通的则不能一笔画
{
printf("Impossible");
return 0;
}
int oushu = 0, jishu = 0;//统计奇数的出度和偶数的出度的个数。
for (int i = 1; i <= tot; i++)
if ((chudu[i] % 2) == 0)//其实只要统计奇数的出度的个数就可以了。
oushu++;
else
jishu++;
if (jishu == 0 || jishu == 2)//可以看到只要统计奇数的出度个数就可以。。
printf("Possible");
else
printf("Impossible");
return 0;
}

【u008】瑞瑞的木棍的更多相关文章

  1. 洛谷P1333 瑞瑞的木棍(欧拉回路)

    题目描述 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色都是相同的,给出每根木棍两端的颜色,请问 ...

  2. 洛谷【P1090】合并果子&&洛谷【P1334】瑞瑞的木板

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 合并果子题目传送门:https://www.luogu.org/problemnew/show/P1 ...

  3. 洛谷 P1334 瑞瑞的木板==P2664 【题目待添加】

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  4. P1334 瑞瑞的木板 洛谷

    https://www.luogu.org/problem/show?pid=1334 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...

  5. P1334 瑞瑞的木板

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  6. 洛谷 P1334 瑞瑞的木板

    P1334 瑞瑞的木板 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了 ...

  7. 【u009】瑞瑞的木板

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...

  8. [題解]luogu_P1333瑞瑞的木棍(并查集/圖論)

    是一道歐拉路的題竟然沒看出來...... 把每種顏色看成一個點,每根木棍看成一個邊,即相同顏色在圖中接好合併成了一個點, 問題轉化為了求是否存在歐拉路 如果用map會超時,所以可以用字典樹實現離散化/ ...

  9. 洛谷.1333.瑞瑞的木棍(欧拉路径 Hash)

    题目链接 #include <cstdio> #include <cstring> const int N=2e6+5,M=5e5+5,mod=2e6; const int s ...

随机推荐

  1. BZOJ5137: [Usaco2017 Dec]Standing Out from the Herd(广义后缀自动机,Parent树)

    Description Just like humans, cows often appreciate feeling they are unique in some way. Since Farme ...

  2. Centos下Elasticsearch安装详细教程

    Centos下Elasticsearch安装详细教程 1.Elasticsearch简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 ...

  3. Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集

    m种阳离子 n种阴离子 然后一个m*n的矩阵 第i行第j列为1代表第i种阴离子和第j种阴离子相互吸引 0表示排斥 求在阳离子和阴离子都至少有一种的情况下 最多存在多少种离子能够共存 阴阳离子都至少须要 ...

  4. ImageButton-设置background跟src

    xml中添加ImageButton的background跟src <ImageButton android:id="@+id/tv3" android:layout_widt ...

  5. R语言-方差分析

    方差分析指的是不同变量之间互相影响从而导致结果的变化 1.单因素方差分析: 案例:50名患者接受降低胆固醇治疗的药物,其中三种治疗条件使用药物相同(20mg一天一次,10mg一天两次,5mg一天四次) ...

  6. Android RxBus的实现及简单使用

    RxJava目前已经很火了,如果你尚未了解请看这里.对于RxJava这里不多做介绍.RxBus并不是一个库,而是一种模式.相信大多数开发者都使用过EventBus,作为事件总线通信库,如果你的项目已经 ...

  7. Android Intent的setClass和setClassName的区别

    setClass:跳转到与该工程下的(同一个Application中的)activity或者service setClassName:跳转到不同Applicaiton的activity或者servic ...

  8. golang sort

    package main import ( "fmt" "strings" "sort" ) type Animals []string f ...

  9. Bootstrap时间控件常用配置项

    1.给下面4个文本框初始化   $(function(){ $("#orderStartTime,#orderEndTime,#preSaleStartTime,#preSaleEndTim ...

  10. webpack4 多页面,多环境配置,逐行解释

    项目需求制作为新的app的分享页,故需要制作多页面应用,那既然app是新的,这边我们也要更新上,经过多方考察(度娘)下,综合了一些他人的优点并结合项目实况产生了此文. 本文为了解释详细,篇幅可能会较长 ...