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. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  2. redirect_uri 参数错误

    http://www.cnblogs.com/zitjubiz/p/5935712.html http://blog.csdn.net/u014033756/article/details/52038 ...

  3. wmi 一些配置(参考)

    http://www.bubuko.com/infodetail-1937463.html

  4. java和javascript日期校验和闰年问题分析和解决方式

    1.闰年的介绍 地球绕太阳执行周期为365天5小时48分46秒(合365.24219天)即一回归年.公历的平年仅仅有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天.故四年于2月加 ...

  5. ProgressBar-style属性分析

    首先我们看下framework下关于进度条的style定义,如下 <style name="Widget.ProgressBar"> <item name=&qu ...

  6. Spark SQL概念学习系列之DataFrame与RDD的区别

    不多说,直接上干货! DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能.Spark能够轻松实现从MySQL到Da ...

  7. COOKIE传值

    1.遍历所有cookie foreach (string  _key in Request.Cookies.AllKeys)//遍历主键            {                Htt ...

  8. 【Codeforces Round #446 (Div. 2) A】Greed

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 贪心选容量大的瓶子就好 [代码] #include <bits/stdc++.h> #define int long l ...

  9. amazeui学习笔记--css(HTML元素3)--表单Form

    amazeui学习笔记--css(HTML元素3)--表单Form 一.总结 1.form样式使用:在容器上添加 .am-form class,容器里的子元素才会应用 Amaze UI 定义的样式. ...

  10. 在 Windows 10 x64 上安装及使用 ab 工具的流程

    本文转自:www.shuijingwanwq.com/2017/04/18/1568/ 1.基于AB测试工具进行高并发情形下的模拟测试,打开:http://httpd.apache.org/docs/ ...