您的位置:首页 > 其它

Codeforces 510C Fox And Names 拓扑排序

2016-01-12 18:38 411 查看

题意

给你n个字符串,问你存不存在一种字母表的顺序,使得这n个字符串是按拓扑序排好的

如果存在,给出这种顺序

思路

这题其实很简单,就是扫一遍相邻两个字符串,建立以字母为节点的有向图

然后跑一个拓扑序

贴出来的原因,主要是犯了一个特别傻的错误。。当年WA的原因,今天又WA在这了。。。也算是给自己提个醒吧。。

错误就是,g[i][j]赋值为1时,没判定原来g[i][j]是否已经为1,就让入度(i) + 1了。。。。。

实现

#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 105;
string str[maxn];
int g[30][30];
int ru[30];
vector<char> ans;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for (int i=0;i<n;i++)
cin>>str[i];
int flag = 0;
for (int i=1;i<n;i++){
bool f1 = 0;
for (int j=0;j<min(str[i-1].length(),str[i].length());j++){
if (str[i][j] != str[i-1][j]){
f1 = 1;
int a = str[i][j] - 'a', b = str[i-1][j] - 'a';
if (g[b][a] == 0){
g[b][a] = 1;
ru[a]++;
}

break;
}
}
if (f1 == 0 && str[i-1].length() > str[i].length()){
flag = 1;
break;
}
}
if (flag){
cout << "Impossible\n";
return 0;
}

queue<int> q;
for (int i=0;i<26;i++){
if (ru[i] == 0)
{
q.push(i);
}
}
while (q.size()){
int tmp = q.front();
q.pop();
ans.push_back((char)('a' + tmp));
for (int i=0;i<26;i++){
if (g[tmp][i] == 1){
ru[i] --;
g[tmp][i] = 0;
if (!ru[i]){
q.push(i);
}
}
}
}
if (ans.size() != 26){
cout << "Impossible\n";
return 0;
}
for (int i=0;i<ans.size();i++){
cout << ans[i];
}
cout << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: