Bellman ford 20pts 感觉是不是不行呢?
#include <bits/stdc++.h>
#define rep(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
const int N=124;
const int D[4][2]={
{0,1},{0,-1},{1,0},{-1,0}
};
int n,m;
int color[N][N];
bool have_c[N][N];
int dis[N][N];
void bellman_ford()
{
rep(i,1,n) rep(j,1,n)
dis[i][j]=1<<30;
dis[1][1]=0;
bool flag;
rep(t,1,n)
{
flag=0;
rep(x,1,n)
rep(y,1,n)
{
if(dis[x][y]==1<<30||color[x][y]==-1)
continue;
rep(dd,0,3)
{
int xx=x+D[dd][0];
int yy=y+D[dd][1];
int re=dis[x][y];
if(color[xx][yy]!=-1&&color[xx][yy]!=color[x][y])
re+=1;
else if(color[xx][yy]==-1)
{
re+=2;
color[xx][yy]=color[x][y];
}
else if(color[xx][yy]==-1)
continue;
dis[xx][yy]=min(dis[xx][yy],re);
if(!have_c[x][y])
color[x][y]=-1;
}
}
if(!flag)
break;
}
}
int main()
{
memset(color,255,sizeof(color));
cin>>n>>m;
rep(i,1,m)
{
int xi,yi,ci;
cin>>xi>>yi>>ci;
color[xi][yi]=ci;
}
rep(i,1,n)
rep(j,1,m)
if(color[i][j]==-1)
have_c[i][j]=0;
else
have_c[i][j]=1;
bellman_ford();
cout<<dis[n][n];
}