社区讨论
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 条回复,欢迎继续交流。
正在加载回复...