前言
卧槽 这题? emm 难道dfs就可以吗 但是我选的标签是拓扑排序啊
拓扑排序 没想到拓扑排序还有这种作用
- 一定要求排列某个数列
思路
我们先 双重循环遍历 数组 找出满足 这个两个条件的数对 给他们加一条边
然后我们直接跑一遍 拓扑排序
证明无环我没看懂,呜呜呜,待补
<大佬的题解>
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =110;
ll n,tot,d[N],ans[N],a[N];
vector<ll> g[N];
void topsort()
{
queue<ll> q;
for(int i=1; i<=n; i++)
if(!d[i])
q.push(i);
while(!q.empty())
{
int u =q.front();
q.pop();
ans[++tot] = u;
for(int i = 0; i<g[u].size(); i++)
{
if(--d[g[u][i]] == 0)
q.push(g[u][i]);
}
}
}
void solve()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if((a[i]*2 == a[j])||(a[i]%3 == 0 && a[i]/3 == a[j]))
{
g[i].push_back(j);
d[j]++;
}
}
topsort();
for(int i=1;i<=n;i++)
cout<<a[ans[i]]<<" ";
}
int main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}