1. 程式人生 > 實用技巧 >【Python高階程式設計025 ● 網路程式設計 ● 開發TCP網路程式注意點】

【Python高階程式設計025 ● 網路程式設計 ● 開發TCP網路程式注意點】

題目連結:https://codeforces.ml/gym/294361/problem/G

題意:給你一些動物,以及一些動物的關係,如果兩種動物是朋友,那他們就可以交換位置,最後再給你一個佇列,你可以讓一些朋友交換位置,問佇列的最小字典序是哪個。

思路:先給動物排個序,然後可以用序號來代替動物名字,再根據他們是否是朋友來進行標記和建邊,最後再跑一遍拓撲排序即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,int > mp;
int book[205][205];
string
a[205]; int b[200005],sum[205],c[200005],num[205],p[200005]; vector<int> ve[205]; int main() { int n,m,k; cin>>n>>m>>k; for(int i=1; i<=n; i++) cin>>a[i]; sort(a+1,a+n+1); for(int i=1; i<=n; i++) { mp[a[i]]=i; book[i][i]=1; }
for(int i=1; i<=m; i++) { string x,y; cin>>x>>y; book[mp[x]][mp[y]]=book[mp[y]][mp[x]]=1; } for(int i=1; i<=k; i++) { string x; cin>>x; b[i]=mp[x]; } for(int i=1; i<=k; i++) { int cnt=0;
for(int j=1; j<=n; j++) { if(!book[b[i]][j]) { cnt+=sum[j]; } } ve[b[i]].push_back(cnt); sum[b[i]]++; } for(int i=1; i<=k; i++) { for(int j=1; j<=n; j++) { if(c[j]<ve[j].size()) { if(ve[j][c[j]]==num[j]) { c[j]++; p[i]=j; for(int k=1; k<=n; k++) { if(!book[k][j]) { num[k]++; } } break; } } } } for(int i=1; i<=k; i++) cout<<a[p[i]]<<' '; cout<<endl; }