这么做为什么样例过不了?
查看原帖
这么做为什么样例过不了?
1050431
DevilsFlame楼主2024/7/29 11:58
#include<bits/stdc++.h>
#define N 5010
using namespace std;
int n,m,a,b,d,f,ans,top,t[N],l[N],ed[N],now[N],sta[N];
bool p[N];
vector <int> q[N];
inline void read(int &x)
{
	x = 0;
	int f = 1;
	char s = getchar();
	while(s < '0' || s > '9')
	{
		if(s == '-') f = -1;
		s = getchar();
	}
	while(s >= '0' && s <= '9')
	{
		x = x * 10 + s - 48;
		s = getchar();
	}
	x *= f;
	return;
}
void dfs(int r)
{
	sta[++ top] = r;
	++ d;
	t[r] = d,l[r] = d;
	for(int i = 0;i < q[r].size();i ++)
	{
		int v = q[r][i];
		if(!t[v])
		{
			dfs(v);
			l[r] = min(l[r],l[v]);
		}
		else if(p[v]) l[r] = min(l[r],t[v]);
	}
	if(t[r] == l[r])
	{
		int plus = 1;
		while(sta[top] != r)
		{
			now[plus ++] = sta[top];
			top --;
		}
		now[plus] = r;
		if(plus > ans)
		{
			for(int i = 1;i <= plus;i ++)//存到答案
				ed[i] = now[i];
			ans = plus;
		}
		top --;
// 		for(int i = ans;i > 1;i --) printf("%d ",end[i]);
// 	printf("%d\n",end[1]);
	}
}
int main()
{
	read(n),read(m);
	for(int i = 1;i <= m;i ++)
	{
		read(a),read(b),read(f);
		q[a].push_back(b);
		if(f == 2) q[b].push_back(a);
	}
	for(int i = 1;i <= n;i ++) if(!t[i]) dfs(i);
	printf("%d\n",ans);
	for(int i = ans;i > 1;i --) printf("%d ",ed[i]);
	printf("%d\n",ed[1]);
	return 0;
}
2024/7/29 11:58
加载中...