求助迷之TLE
查看原帖
求助迷之TLE
222578
jingkongwanglimiaoa楼主2021/8/15 18:02

rt,蒟蒻求助TLE

用的双端队列宽搜,理论上复杂度为500*500啊

# include <cstdio>
using namespace std;
int n,p,l = 1000011,r = 1000010,lk[300010],vis[300010],hp,ans = 0x3f3f3f3f,a[666][666];
char x;
struct sth{
	int ue,we,po;
}e[1000010];
struct node{
	int er,bu;
}q[2000010];
void add(int uu,int vv,int ww)
{
	e[++hp] = {vv,lk[uu],ww},lk[uu] = hp;
	e[++hp] = {uu,lk[vv],ww},lk[vv] = hp;
}
void bfs()
{
	r++;
	q[r] = {1,0};
	while (l <= r)
	{
		node nw = q[l];
		if (vis[nw.er]) continue;
		vis[nw.er] = 1;
		if (nw.er == (n + 1) * (p + 1))
		{
			ans = nw.bu;
			return ;
		}
		l++;
		for (int i = lk[nw.er]; i; i = e[i].we)
		{
			if (vis[e[i].ue]) continue;
			if (e[i].po)
			{
				r++;
				q[r] = {e[i].ue,nw.bu + 1};
			}
			else 
			{
				l--;
				q[l] = {e[i].ue,nw.bu};
			}
		}
	}
}
int main()
{
	scanf("%d %d",&n,&p);
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= p; j++)
		{
			scanf("\n%c",&x);
			if (x == '/') a[i][j] = 0; 
			if (x == '\\') a[i][j] = 1;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= p; j++)
		{
			add((i - 1) * (p + 1) + j,i * (p + 1) + j + 1,(a[i][j] == 0));
			add((i - 1) * (p + 1) + j + 1,i * (p + 1) + j,a[i][j]);
		}
	}
	bfs();
	if (ans != 0x3f3f3f3f) printf("%d",ans);
	else printf("NO SOLUTION");
	return 0;
}
2021/8/15 18:02
加载中...