2783 63分 小蒟蒻求助各位大佬
c++代码
//STL+Tajian
#include<bits/stdc++.h>
#define mian main
const int mxn = 1e5 + 5;
using namespace std;
int d[mxn], low[mxn], col[mxn], dis[mxn];
int n, m, q, cnt;
bool vis[mxn];
unordered_map<int, vector<int> > G, N;//无序map进行遍历(哈希表的形式实现
stack<int> s;//设栈
void mty(int u, int fa) {
d[u] = low[u] = ++cnt;
s.push(u);
for (auto v : G[u]) {
if (v == fa)
continue;
if (!d[v]) {
mty(v, u);
low[u] = min(low[u], low[v]);
if (low[v] > d[u]) {
vis[v] = 1;
}
} else
low[u] = min(low[u], d[v]);
}
if (low[u] == d[u]) {
col[u] = u;
while (s.top() != u) {
col[s.top()] = u;
s.pop();
}
s.pop();
}
}//离线Tanjian求值
//使用到并查集
int fa(int s, int t) {
memset(dis, -1, sizeof dis);//处理
queue<int> q;
q.push(s);
dis[s] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (auto v : N[u])
if (dis[v] == -1 || dis[v] > dis[u] + 1) {
dis[v] = dis[u] + 1;
q.push(v);
}
}
return dis[t];
}//离线tanjian求祖先的链长
void chazhao(int x) {//找寻答案
stack<int> S;
while (x) {
S.push(x & 1);
x >>= 1;
}
while (!S.empty()) {
cout << S.top();
S.pop();
}
cout << "\n";//防止endl缓冲区减速
}
int mian() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//快
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++)
if (!d[i])
mty(i, 0);
for (int i = 1; i <= n; i++) {
for (auto v : G[i]) {//不改变迭代对象的值
if (col[i] == col[v])
continue;
N[col[i]].push_back(col[v]);
N[col[v]].push_back(col[i]);
}
}
cin >> q;
while (q--) {
int s, t;
cin >> s >> t;
chazhao(fa(s, t) + 1);
}
}