认识的动物可以交换,找出其中字典序最小的一种排列
思路:思路就是拓扑排序
先把所有的动物名称进行排序,用他们的位置代表他们的名称,然后算出哪些是朋友,核心部分就是对每个字符串进行处理,对每个位置的动物进行处理实际上就是把每种动物都看成一个点,可以交换的就看成两个点之间有一条边,然后跑一边拓扑排序就出来。
for(int i=1;i<=l;i++)
{
int cnt=0;
for(int j=1;j<=n;j++)
{
if(!vis[pos[i]][j])
{
cnt+=sum[j];
}
}
vt[pos[i]].push_back(cnt);//把每个字符串看成一条边,
sum[pos[i]]++;//这个点前面有多少个点进行了计算
}
拓扑排序
for(int i=1;i<=l;i++)
for(int j=1;j<=n;j++)
if(pos2[j]<vt[j].size())//如果大于证明跟j朋友关系的点已经算完了
if(vt[j][pos2[j]]==num[j])//相当于当这个点为0的时候,前面的都计算完了,到这个点入列
{
pos2[j]++;
p