社区讨论

Dijk+链式前向星 总是输出-1 求条

P3956[NOIP 2017 普及组] 棋盘参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlkcrayg
此快照首次捕获于
2026/02/13 11:53
6 天前
此快照最后确认于
2026/02/15 23:55
4 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N=1e2+19;
int n,m,x,y,c,a[N][N],dis[N],vis[N];
struct edge{
	int to,w,nxt;
}e[N];
int h[N],idx;
int f(int x,int y){return m*(x-1)+y;}//坐标转化数字
void addedge(int u,int v,int w){
	e[++idx].to=v;
	e[idx].w=w;
	e[idx].nxt=h[u];
	h[u]=idx;
}
void add(int u,int v,int w){
	addedge(u,v,w);addedge(v,u,w);
}
int main(){
	//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>m>>n;
	memset(dis,0x3f3f3f3f,sizeof(dis));
	for(int i=1;i<=n;i++){
		cin>>x>>y>>c;
		if(c==0)a[x][y]=2;
		else a[x][y]=c;
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++){
			if(a[i+1][j]){
				if(a[i][j]==a[i+1][j])add(f(i,j),f(i+1,j),0);
				else add(f(i,j),f(i+1,j),1);
			}
			if(a[i][j+1]){
				if(a[i][j]==a[i][j+1])add(f(i,j),f(i,j+1),0);
				else add(f(i,j),f(i,j+1),1);
			}
			if(a[i+1][j+1]){
				if(a[i][j]==a[i+1][j+1])add(f(i,j),f(i+1,j+1),2);
				else add(f(i,j),f(i+1,j+1),3);
			}
			if(a[i+1][j-1]){
				if(a[i][j]==a[i+1][j-1])add(f(i,j),f(i+1,j-1),2);
				else add(f(i,j),f(i+1,j-1),3);
			}
			if(a[i][j+2]){
				if(a[i][j]==a[i][j+2])add(f(i,j),f(i,j+2),2);
				else add(f(i,j),f(i,j+2),3);
			}
			if(a[i+2][j]){
				if(a[i][j]==a[i+2][j])add(f(i,j),f(i+2,j),2);
				else add(f(i,j),f(i+2,j),3);
			}
		}
	}
	priority_queue<pii,vector<pii>,greater<pii>> q;
	q.push(make_pair(0,1));
	dis[1]=0,vis[1]=1;
	while(q.size()){
		auto t=q.top().second;
		q.pop();
		if(vis[t])continue;
		vis[t]=1;
		for(int i=h[t];i;i=e[i].nxt){
			int v=e[i].to,w=e[i].w;
			if(dis[v]>dis[t]+w){
				dis[v]=dis[t]+w;
				q.push(make_pair(dis[v],v));
			}
		}
	}
	int ans=dis[f(m,m)];
	if(ans==0x3f3f3f3f)cout<<-1;
	else cout<<ans;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...