下面两个写得很清楚了,就不在赘述。

http://blog.sina.com.cn/s/blog_5cd4cccf0100apd1.html
http://www.cnblogs.com/lyy289065406/archive/2011/07/30/2122265.html

我这里没用trie来表示颜色种类,而是用数组对颜色离散化,之后就差不多一样了,用并查集判断是否连通,再判断奇顶点的个数是否为0个或2个。

这题我开始大意了,刚开始就只判断奇数度的节点个数是否为0或2,没有考虑判断图的连通性。
以后要注意碰到图的问题要考虑连通性的问题。

#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm>
#include <string> using namespace std;
const int maxn=;
int num[maxn]; //存储某颜色出现的个数
int idx=;
int cnt;
int idxw=; struct Wood{
char left[],right[];
}wood[maxn/]; struct Node{
char str[]; //存储颜色
bool operator<(const Node tmp)const{
if(strcmp(str,tmp.str)<=)
return true;
else
return false;
}
}node[maxn];
//二分查找颜色对应离散的值
int binarySearch(char*str){
int l=,r=cnt+,mid;
while(r-l>){
mid=(r+l)/;
if(strcmp(node[mid].str,str)<=)
l=mid;
else
r=mid;
}
return l;
}
struct UF{
int fa[maxn];
void init(){
for(int i=;i<maxn;i++)
fa[i]=i;
}
int find_root(int x){
if(fa[x]!=x)
fa[x]=find_root(fa[x]);
return fa[x];
}
void Union(int a,int b){
int x=find_root(a); //一开始这里写错了,括号里的写成了x和y。。。导致一直WA。。。
int y=find_root(b);
fa[y]=x;
}
}uf;
int main()
{
char s1[],s2[];
while(scanf("%s%s",wood[idxw].left,wood[idxw].right)!=EOF){
strcpy(node[idx++].str,wood[idxw].left);
strcpy(node[idx++].str,wood[idxw].right);
idxw++;
}
sort(node+,node+idx);
memset(num,,sizeof(num));
cnt=;
num[]++;
//进行离散处理,同时统计每种颜色出现的个数
for(int i=;i<idx;i++){
if(strcmp(node[i].str,node[i-].str)!=){
strcpy(node[++cnt].str,node[i].str);
num[cnt]++;
}
else{
num[cnt]++;
}
}
int u,v;
uf.init();
for(int i=;i<idxw;i++){
u=binarySearch(wood[i].left);
v=binarySearch(wood[i].right);
uf.Union(u,v);
}
int c=,eular=; //c为连通分支的个数,如果为1,表明图连通;eular为奇顶点的个数。
for(int i=;i<=cnt;i++){
if(uf.fa[i]==i){
c++;
}
if(num[i]%==){
eular++;
}
}
//idxw==1表明数据为空,要输出Possible,这点要注意!
//所有点都在同一个集合,且某颜色出现次数为奇数的只能为0个或2个,即存在欧拉通路。
if(idxw== || (c==&&(eular==||eular==))){
printf("Possible\n");
}
else
printf("Impossible\n");
return ;
}

最新文章

  1. 了解 Spring Data JPA
  2. UVA 820 --- POJ 1273 最大流
  3. 周末被一个BUG折腾的欲仙欲死
  4. JavaScript之作用域和引用类型
  5. Sphinx 实时索引
  6. impdp使用
  7. Maven学习笔记-01-Maven入门
  8. Python新手学习基础之运算符——比较运算符
  9. 深入理解Azure自动扩展集VMSS(1)
  10. C++ 虚函数表决心
  11. ASP.NET状态服务及session丢失问题解决方案总结
  12. javascript 二维(多维)数组的复制问题
  13. Unity3d 截屏保存到相册,并且刷新相册
  14. obj-c编程02:给类自动合成存取方法
  15. 【原创】Linux基础之vi
  16. OpenGIS
  17. 10.27 rest_framework(1)
  18. mysql 用户表结构设计,第三方登录
  19. 下载tensorflow-gpu版本的源
  20. 移动端经常出现的兼容问题,谈谈移动端应用或者wap站的一些优化技巧和心得

热门文章

  1. 【设计模式】策略模式 (Strategy Pattern)
  2. sftp
  3. CSS3设置字体
  4. 如何配置DNS服务器(局域网——域名指向某个IP地址)
  5. [转]windows 软链接的建立及删除
  6. 16.如何设置Quartus II Programmer,保护pof不被读出
  7. Android实现网络访问
  8. C++实现禁忌搜索解决TSP问题
  9. (转)要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。”的解决办法。
  10. 代码实现native2assci