关于01BFS建图TLE
查看原帖
关于01BFS建图TLE
773503
Falling_Sakura楼主2023/7/21 18:59

代码:

#include<bits/stdc++.h>
using namespace std;
const int M=4e6+5000;
char e[1050][1050];
bool vis[M>>2];
int t,n,m,cnt,sum;
struct edge
{
    int nxt,to,val;
}ed[M];
int fir[M>>2],dist[M>>2];
void add(int u,int v,int w)
{
    ed[++cnt].nxt=fir[u];
    ed[cnt].to=v;
    ed[cnt].val=w;
    fir[u]=cnt;
}
inline int read()
{
	int x=0,y=1;//x是什么,y是正负 
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-') y=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*y;
}
void _01BFS(int x)
{
    for(int i=1;i<=sum;i++)
    {
        dist[i]=INT_MAX;
        vis[i]=false;
    }
    deque<int> q;
    dist[x]=0;
    q.push_back(x);
    vis[x]=true;
    while(q.size())
    {
        int p=q.front();
        q.pop_front();
        vis[p]=false;
        for(int i=fir[p];i;i=ed[i].nxt)
        {
            int v=ed[i].to;
            int d=dist[p]+ed[i].val;
            if(dist[v]>d)
            {
                dist[v]=d;
                if(!vis[v])
                {
                    vis[v]=true;
                    if(ed[i].val==0) q.push_front(v);
                    else q.push_back(v);
                }
            }
        }
    }
}
int main()
{
    char c;
    t=read();
    while(t--)
    {
        n=read(),m=read();
        sum=n*m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                while(c<'a'||c>'z') c=getchar();
                e[i][j]=c;
                c='\0';
            }
        for(int i=1;i<=n;i++)//建图
            for(int j=1;j<=m;j++)
            {
                int pos=(i-1)*m+j;
                if(i+1<=n) add(pos,pos+m,e[i][j]==e[i+1][j]?0:1);
                if(i-1>=1) add(pos,pos-m,e[i][j]==e[i-1][j]?0:1);
                if(j+1<=m) add(pos,pos+1,e[i][j]==e[i][j+1]?0:1);
                if(j-1>=1) add(pos,pos-1,e[i][j]==e[i][j-1]?0:1);
            }
        
        _01BFS(1);
        printf("%d\n",dist[sum]);
        // for(int i=1;i<=cnt;i++)
        // {
        //     ed[i].to=0;
        //     ed[i].val=0;
        //     ed[i].nxt=0;
        // }
        memset(fir,0,sizeof(fir));
        // memset(e,'\0',sizeof(e));  
        cnt=0;
    }
    return 0;
}
2023/7/21 18:59
加载中...