您的位置:首页 > 其它

Codeforces Round #290 (Div. 2) - C. Fox And Names (拓扑排序)

2015-08-27 20:16 302 查看
题目:
http://codeforces.com/problemset/problem/510/C
题意:

题目给出的单词按照字典序排列,求出符合这些排列的 26个字母的排列。

思路:

拓扑排序。

AC.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;
char s[105][105];
int in[105], ou[105];

int tol, head[105];
struct Edge{
int to, next;
}edge[5000];
void addedge(int u, int v)
{
edge[tol].to = v;
edge[tol].next = head[u];
head[u] = tol++;
}

vector<int> vec;
void tuopu()
{
vec.clear();
queue<int> que;
for(int i = 0; i <= 25; ++i) {
if(!ou[i]) que.push(i);
}
while(!que.empty()) {
int u = que.front(); que.pop();
vec.push_back(u);
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
ou[v]--;
if(ou[v] == 0) que.push(v);
}
}
if(vec.size() < 26) {
printf("Impossible\n");
return;
}
for(int i = vec.size()-1; i >= 0; --i) {
char ch = vec[i] + 'a';
printf("%c", ch);
}
printf("\n");
}
void init()
{
tol = 0;
memset(head, -1, sizeof(head));
memset(in, 0, sizeof(in));
memset(ou, 0, sizeof(ou));
}
int main()
{
//freopen("in", "r", stdin);
int n;
while(~scanf("%d", &n)) {
init();
int ok = 1;
for(int i = 0; i < n; ++i) {
scanf("%s", s[i]);
for(int j = 0; j < i; ++j) {
int s1 = strlen(s[i]), s2 = strlen(s[j]);
int p1 = 0, p2 = 0;
while(s[i][p1] == s[j][p2] && p1 < s1 && p2 < s2) {
p1++; p2++;
}
if(p1 == s1 && p2 != s2) ok = 0;
if(p1 != s1 && p2 != s2) {
int u = s[i][p1] - 'a', v = s[j][p2] - 'a';
addedge(u, v);
in[u]++;
ou[v]++;
}
}
}
if(!ok) printf("Impossible\n");
else
tuopu();
}
return 0;
}



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