基础最短路求调
查看原帖
基础最短路求调
299922
atarashiTLE楼主2023/10/17 16:47

如题。小数据拍了半个小时没结果 大数据一分钟出来,也没看出来什么性质

#include<bits/stdc++.h>
#define int long long
#define N 2000010 
#define CQD 1000
#define MOD 1000000007
#define DEBUG(x) (cout<<#x"="<<x<<'\n')
#define lowbit(a) ((a)&(-(a)))
using namespace std;
int m,n,lnsz,hd[N],dijk[N];
char mp[300][300];bool vis[N];
bool isha(char c){
	return c>='A'&&c<='Z';
}
struct ln{
	int u,v,w,nxt;
}a[N<<2];
void mrg(int u,int v,int w){
	a[++lnsz].u=u;
	a[lnsz].v=v;
	a[lnsz].w=w;
	a[lnsz].nxt=hd[u];
	hd[u]=lnsz;
//	cout<<"Mrg:("<<u/(n+1)<<","<<u%(n+1)<<")->("<<v/(n+1)<<","<<v%(n+1)<<"),w="<<w<<endl;
}
struct cmp{
	bool operator () (int a,int b){
		return dijk[a]>dijk[b];
	}
};
priority_queue<int,vector<int>,cmp> q;
void dij(int root){
	dijk[root]=0;vis[root]=1;
	q.push(root);
	while(!q.empty()){
		int tp=q.top();q.pop();vis[tp]=0;
		for(int i=hd[tp];i;i=a[i].nxt)
			if(dijk[a[i].v]>dijk[tp]+a[i].w){
				dijk[a[i].v]=dijk[tp]+a[i].w;
				if(!vis[a[i].v]){
					vis[a[i].v]=1;
					q.push(a[i].v);
				}
			}
	}
}
int arqd(char a,char b){
	int ans=0;
	while(a!=b){
		ans++;
		if(a=='N')a='E';
		else if(a=='E')a='S';
		else if(a=='S')a='W';
		else a='N';
	}
	return ans;
}
signed main(){
	freopen("explore.in","r",stdin);
	freopen("explore.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie();cout.tie();
	cin>>m>>n;
	for(int i=0;i<N;i++)dijk[i]=9220000000000000000ll;
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			cin>>mp[i][j];
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++){
			if(mp[i][j]=='X')continue;
			if(i!=1)mrg(i*CQD+j,(i-1)*CQD+j,arqd(mp[i][j],'N'));
			if(j!=1)mrg(i*CQD+j,i*CQD+j-1,arqd(mp[i][j],'W'));
			if(i!=m)mrg(i*CQD+j,(i+1)*CQD+j,arqd(mp[i][j],'S'));
			if(j!=n)mrg(i*CQD+j,i*CQD+j+1,arqd(mp[i][j],'E'));
		}
	memset(vis,0,sizeof(vis));
	dij(CQD+1);
	if(dijk[m*CQD+n]==9220000000000000000ll)dijk[m*CQD+n]=-1;
	cout<<dijk[m*CQD+n]<<endl;
	return 0;
}
2023/10/17 16:47
加载中...