拓扑序不用设置深度排序,我得复习一下
#include<bits/stdc++.h>
using namespace std;
using ll =long long;
const int N =1e6+4;
int n;
int degree[N];
int head[N],e[N],net[N],cnt;
unordered_map<string,int> mmap;
unordered_map<int,string> anti_mmap;
void add(int a,int b)
{
e[cnt]=b,net[cnt]=head[a],head[a]=cnt++;
}
int main()
{
memset(head,-1,sizeof head);
scanf("%d",&n);
int node_index=1;
getchar();
vector<string> pre;
for(int i=1;i<=n;i++)
{
//按照句号分割
string s;
getline(cin,s);
istringstream ss(s);
vector<string> cur;
while(getline(ss,s,'.'))
{
if(mmap.count(s))
{
cur.push_back(s);
}else{
mmap[s]=node_index;
anti_mmap[node_index++]=s;
cur.push_back(s);
}
}
if(pre.size()==0){
pre=cur;
continue;
}
//如果个数相等那就可以比较了
if(cur.size()==pre.size()){
for(int i=0;i<cur.size();i++)
{
if(cur[i]!=pre[i])
{
add(mmap[pre[i]],mmap[cur[i]]);
degree[mmap[cur[i]]]++;
break;
}
}
}
pre=cur;
}
vector<string> ans;
//不可以直接写一个stirng,这样就退化成一个字典序了度,应该再加个深
//不加深度才是拓扑排序,
set<pair<int,string>> sset;
for(int i=1;i<node_index;i++)
{
// cout<<anti_mmap[i]<<" "<<degree[i]<<endl;
if(degree[i]==0){
sset.emplace(make_pair(0,anti_mmap[i]));
}
}
while(sset.size())
{
auto ttop=*(sset.begin());
sset.erase(sset.begin());
ans.push_back(ttop.second);
for(int i=head[mmap[ttop.second]];i!=-1;i=net[i])
{
degree[e[i]]--;
if(degree[e[i]]==0)
{
sset.insert(make_pair(0,anti_mmap[e[i]]));
}
}
}
if(ans.size()!=node_index-1){
cout<<"Wrong"<<endl;
}
for(int i=0;i<ans.size();i++)
{
if(i==ans.size()-1)
cout<<ans[i];
else
cout<<ans[i]<<'.';
}
return 0;
}