RC-u4 相对论大师
作者:
logos--
,
2023-07-31 17:31:16
,
所有人可见
,
阅读 159
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 2e5 + 7, M = 11;
constexpr int inf = 1E18, mod = 998244353;
int n;
map<string, vector<string>> G;
map<string, string> pre;
vector<string> ss;
map<string, bool> vis;
inline int bfs(string st, string ed) {
queue<string> q;
q.push(st);
map<string, int> dis;
map<string, bool> V;
while(q.size()) {
auto u = q.front();
q.pop();
int len = G[u].size();
for (int i = 0; i < len; i ++) {
string p = G[u][i];
if(V[p]) continue;
V[p] = true;
dis[p] = dis[u] + 1;
pre[p] = u;
q.push(p);
if(p == ed) return dis[p];
}
}
return -1;
}
inline void Main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
string s1, s2, s3, s4;
cin >> s1 >> s2 >> s3 >> s4;
G[s1 + " " + s2].push_back(s3 + " " + s4);
vis[s1 + " " + s2] = true;
vis[s3 + " " + s4] = true;
}
int mn = 0x3f3f3f3f;
string ans1 = "", ans2 = "";
for (auto [x, y] : vis) {
string st = x, ed;
int len = x.size();
if(x.back() == '0') {
ed = x.substr(0, len - 1) + "1";
}else ed = x.substr(0, len - 1) + "0";
int d = bfs(st, ed);
if(d != -1) {
if(d < mn) {
mn = d, ans1 = st, ans2 = ed;
}
}
}
bfs(ans1, ans2);
string now = ans2;
while(1) {
ss.push_back(now);
if(now == ans1) break;
now = pre[now];
}
reverse(ss.begin(), ss.end());
for (int i = 0; i < ss.size(); i ++) {
string p = ss[i];
cout << p << " ";
if(i != 0 && i != ss.size() - 1) cout << p << " ";
}
cout << "= " << ans1 << " " << ans2 << '\n';
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
int T = 1;
while(T --) Main();
return 0;
}