听灌佬多
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/7/17 14:30
  • 上次更新2024/7/17 15:05:41
查看原帖
听灌佬多
1260021
封禁用户楼主2024/7/17 14:30

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);
	}
}
2024/7/17 14:30
加载中...