[求条:解者10关]这道题为什么不能用最短路?(2024第一题被卡)
查看原帖
[求条:解者10关]这道题为什么不能用最短路?(2024第一题被卡)
766675
da_ke楼主2024/1/1 12:33

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];
}
2024/1/1 12:33
加载中...