POJ 1386 Play on Words
2009-10-23 22:13
302 查看
/*
欧拉路径
并查集判断连通性
建图:小写字母作为结点,对于单词hello,为h的出度增加1,为o的入度增加1
*/
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int caseNum, wordNum, letterNum;
char temp[1002];
struct letter
{
char type;
int rank, setId, inDeg, outDeg;
}letters[26];
int getIndex(char c)
{
for(int i = 0; i < letterNum; i++)
if(letters[i].type == c)
return i;
return -1;
}
void init()
{
int i;
letterNum = 0;
for(i = 0; i < 26; i++)
{
letters[i].rank = 0;
letters[i].setId = i;
letters[i].inDeg = letters[i].outDeg = 0;
}
}
int find(int id)
{
if(letters[id].setId == id) return id;
else return letters[id].setId = find(letters[id].setId);
}
void join(int id1, int id2)
{
int sid1 = find(id1), sid2 = find(id2);
if(sid1 == sid2) return;
if(letters[sid1].rank < letters[sid2].rank)
letters[sid1].setId = sid2;
else
{
letters[sid2].setId = sid1;
if(letters[sid1].rank == letters[sid2].rank)
letters[sid1].rank++;
}
}
int main()
{
int c, w, wordNum;
char head, tail;
scanf("%d", &caseNum);
for(c = 1; c <= caseNum; c++)
{
scanf("%d", &wordNum);
init();
for(w = 0; w < wordNum; w++)
{
scanf("%s", temp);
head = temp[0];
tail = temp[strlen(temp) - 1];
int indexH = getIndex(head);
if(indexH == -1)
{
letterNum++;
indexH = letterNum - 1;
letters[indexH].type = head;
}
int indexT = getIndex(tail);
if(indexT == -1)
{
letterNum++;
indexT = letterNum - 1;
letters[indexT].type = tail;
}
letters[indexH].outDeg++;
letters[indexT].inDeg++;
join(indexH, indexT);
}
bool can = true;
bool connect = true;
int setId0 = find(0);
for(w = 1; w < letterNum; w++)
{
if(find(w) != setId0)
{
connect = false;
break;
}
}
if(!connect) can = false;
if(can)
{
int oddNum = 0;
for(w = 0; w < 26; w++)
{
int sub = abs(letters[w].inDeg - letters[w].outDeg);
if(sub >= 2) {can = false; break;}
else if(sub == 1) oddNum++;
}
if(can)
{
if(!(oddNum == 0 || oddNum == 2))
can = false;
}
}
if(can) printf("Ordering is possible./n");
else printf("The door cannot be opened./n");
}
return 0;
}
欧拉路径
并查集判断连通性
建图:小写字母作为结点,对于单词hello,为h的出度增加1,为o的入度增加1
*/
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int caseNum, wordNum, letterNum;
char temp[1002];
struct letter
{
char type;
int rank, setId, inDeg, outDeg;
}letters[26];
int getIndex(char c)
{
for(int i = 0; i < letterNum; i++)
if(letters[i].type == c)
return i;
return -1;
}
void init()
{
int i;
letterNum = 0;
for(i = 0; i < 26; i++)
{
letters[i].rank = 0;
letters[i].setId = i;
letters[i].inDeg = letters[i].outDeg = 0;
}
}
int find(int id)
{
if(letters[id].setId == id) return id;
else return letters[id].setId = find(letters[id].setId);
}
void join(int id1, int id2)
{
int sid1 = find(id1), sid2 = find(id2);
if(sid1 == sid2) return;
if(letters[sid1].rank < letters[sid2].rank)
letters[sid1].setId = sid2;
else
{
letters[sid2].setId = sid1;
if(letters[sid1].rank == letters[sid2].rank)
letters[sid1].rank++;
}
}
int main()
{
int c, w, wordNum;
char head, tail;
scanf("%d", &caseNum);
for(c = 1; c <= caseNum; c++)
{
scanf("%d", &wordNum);
init();
for(w = 0; w < wordNum; w++)
{
scanf("%s", temp);
head = temp[0];
tail = temp[strlen(temp) - 1];
int indexH = getIndex(head);
if(indexH == -1)
{
letterNum++;
indexH = letterNum - 1;
letters[indexH].type = head;
}
int indexT = getIndex(tail);
if(indexT == -1)
{
letterNum++;
indexT = letterNum - 1;
letters[indexT].type = tail;
}
letters[indexH].outDeg++;
letters[indexT].inDeg++;
join(indexH, indexT);
}
bool can = true;
bool connect = true;
int setId0 = find(0);
for(w = 1; w < letterNum; w++)
{
if(find(w) != setId0)
{
connect = false;
break;
}
}
if(!connect) can = false;
if(can)
{
int oddNum = 0;
for(w = 0; w < 26; w++)
{
int sub = abs(letters[w].inDeg - letters[w].outDeg);
if(sub >= 2) {can = false; break;}
else if(sub == 1) oddNum++;
}
if(can)
{
if(!(oddNum == 0 || oddNum == 2))
can = false;
}
}
if(can) printf("Ordering is possible./n");
else printf("The door cannot be opened./n");
}
return 0;
}
相关文章推荐
- POJ 1386 Play on Words(欧拉路)
- POJ 1386 Play on Words
- zoj 2016 poj 1386 Play on Words 欧拉回路+DFS
- POJ 1386 Play on Words(有向欧拉通路 连通图)
- poj_1386 Play on Words(欧拉路)
- [欧拉回路] poj 1386 Play on Words
- POJ 1386 Play on Words(欧拉路经典题)
- poj 1386 Play on Words 【图论-欧拉路】
- uva 10129 poj 1386 hdu 1116 zoj 2016 play on words
- POJ 1386 Play on Words
- poj 1386-Play on Words-并查集+欧拉
- POJ 1386 Play on Words
- 【欧拉路径(有向图)】poj 1386 play on words
- POJ 1386 Play on Words(判定图欧拉通路是否存在)(并查集+有向图存在欧拉路)
- poj 1386 Play on Words
- POJ 1386 Play on Words [欧拉路]
- poj 1386 Play on Words
- UVa 10129 & HDU 1116 & POJ 1386 - Play on Words
- poj 1386 Play on Words 有向图欧拉路径判断
- poj1386 Play on Words