萌新刚学 SPFA ,70pts 求调!
查看原帖
萌新刚学 SPFA ,70pts 求调!
409394
AssassinQ楼主2023/7/7 10:45

输出的比数据小1。

#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
using namespace std;
const ll MAXM=105; 
ll m,n,x,y,c,a[MAXM][MAXM],idx[5]={0,-1,1},idy[5]={0,0,0,-1,1},f[MAXM][MAXM];
bool p[MAXM][MAXM];
struct node{
	ll h,l,s,c;
};
queue<node> q;
bool oks(ll x,ll y,ll z,ll c){
	if(x+idx[z]<1||x+idx[z]>m||y+idy[z]<1||y+idy[z]>m) return false;
	if(!a[x][y]&&!a[x+idx[z]][y+idy[z]]) return false;
	ll coin=0;
	if(!a[x+idx[z]][y+idy[z]]) coin=2;
	else if(a[x+idx[z]][y+idy[z]]!=c) coin=1;
	if(f[x][y]+coin>=f[x+idx[z]][y+idy[z]]) return false;
	f[x+idx[z]][y+idy[z]]=f[x][y]+coin;
	return true;
}
void spfa(){
	node t={0};
	q.push({1,1,0,a[1][1]});
	f[1][1]=0;
	p[1][1]=true;
	while(!q.empty()){
		t=q.front(); q.pop();
		p[t.h][t.l]=false;
		for(int i=1;i<=4;i++){
			if(oks(t.h,t.l,i,t.c)&&!p[t.h+idx[i]][t.l+idy[i]]){
				p[t.h][t.l]=true;
				ll tc=a[t.h+idx[i]][t.l+idy[i]];
				if(!tc) tc=a[t.h][t.l];
				q.push({t.h+idx[i],t.l+idy[i],f[t.h+idx[i]][t.l+idy[i]],tc});
			}
		}
	}
	return;
} 
int main(){
	memset(f,127/3,sizeof(f));
	scanf("%lld%lld",&m,&n);
	for(int i=1;i<=n;i++){
		scanf("%lld%lld%lld",&x,&y,&c);
		a[x][y]=c+1;
	}
	spfa();
	if(f[m][m]<=inf) printf("%lld",f[m][m]);
	else printf("-1");
	return 0;
}
2023/7/7 10:45
加载中...