tarjan求调
查看原帖
tarjan求调
1122193
FarmerDrone楼主2024/11/13 22:39
#include <bits/stdc++.h>
using namespace std;

bool to[5005][5005];
priority_queue <int, vector <int>, greater <int> > ans[5005];
bool vis[5005];
stack <int> s;
bool ins[5005];
int df[5005], lw[5005];
int it, n;

void trj(int i)
{
	df[i] = lw[i] = ++it;
	s.push(i);
	ins[i] = 1;
	for (int j = 1; j <= n; j++)
		if (to[i][j] && ! vis[j])
			if (ins[j])
				lw[i] = min(lw[i], lw[j]);
			else
				trj(j),
				lw[i] = min(lw[i], lw[j]);
//	cout << i << " " << df[i] << " " << lw[i] << endl;
	if (df[i] == lw[i])
	{
		while (s.top() != i)
			ins[s.top()] = 0,
			ans[i].push(s.top()),
			s.pop();
		ins[i] = 0;
		s.pop();
		ans[i].push(i);
	}
	vis[i] = 1;
}

int main()
{
	int m;
	cin >> n >> m;
	int op, u, v;
	while (m--)
		cin >> u >> v >> op,
		to[u][v] = 1,
		to[v][u] |= (op == 2);
	for (int i = 1; i <= n; i++)
		if (! vis[i])
			trj(i);
	int mx = 0;
	int mxi;
	for (int i = 1; i <= n; i++)
		if (mx < ans[i].size())
			mx = ans[i].size(),
			mxi = i;
	/*for (int i = 1; i <= n; i++)
	{
		cout << i << ": ";
		while (! ans[i].empty())
			cout << ans[i].top() << " ",
			ans[i].pop();
		cout << endl;
	}*/
	cout << mx << endl;
	while (! ans[mxi].empty())
		cout << ans[mxi].top() << " ",
		ans[mxi].pop();
	cout << endl;
	return 0;
}
2024/11/13 22:39
加载中...