您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: