Xanadu(構圖+最短路)

 

 

題解:將修改幾次1等價爲構圖時邊的權值即可。跑單源最短路。

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;

#define N 301
#define LL long long
int n;

int sumedge;

int head[N];
LL dis[N];
int vis[N];

queue<int>q;

struct Edge
{
    
    int x,y,z,nxt;
    Edge(int x=0,int y=0,int z=0,int nxt=0):
    x(x),y(y),z(z),nxt(nxt){}
}edge[N*N];

void add(int x,int y,int z)
{
    edge[++sumedge]=Edge(x,y,z,head[x]);
    head[x]=sumedge;
}

void spfa()
{
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;q.push(1);vis[1]=1;
    while(!q.empty())
    {
        int now=q.front();q.pop();vis[now]=false;
        for(int i=head[now];i;i=edge[i].nxt)
        {
            int v=edge[i].y;
            if(dis[v]>dis[now]+edge[i].z)
            {
                dis[v]=dis[now]+edge[i].z;
                if(!vis[v])
                {
                    vis[v]=true;
                    q.push(v);
                }
            }
        }
    }
}

int main()
{
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int js=0;
        for(int j=1;j<=n;j++)
        {
            int x;
            scanf("%d",&x);
            if(x) add(i,j,js++);
        }
    }
    spfa();
      if(dis[n]==0x3f3f3f)printf("-1\n");
    else printf("%lld\n",dis[n]);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章