1 条题解

  • 1
    @ 2022-8-27 9:16:15
    #include<bits/stdc++.h>
    #define maxn 1200000
    #define inf 2000000000
    using namespace std;
    template<typename T> inline void read(T &x)
    {
    	x=0;char c=getchar();bool flag=false;
    	while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
    	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    	if(flag) x=-x;
    }
    int n,s,t;
    struct edge
    {
        int to,nxt,v;
    }e[maxn];
    int head[maxn],edge_cnt;
    void add(int from,int to,int val)
    {
        e[++edge_cnt]=(edge){to,head[from],val};
        head[from]=edge_cnt;
    }
    int num(int x,int y)
    {
    	return y+(x-1)*n;
    }
    struct node
    {
        int val,num;
        friend bool operator <(const node &x,const node &y)
        {
            return x.val>y.val;
        }
    };  
    priority_queue<node> q;
    int dis[maxn];
    bool vis[maxn];
    void dijkstra()
    {
        for(int i=s;i<=t;++i) dis[i]=inf;
        dis[s]=0;
        q.push((node){0,s});
        while(!q.empty())
        {
            node tmp=q.top();
            q.pop();
            int x=tmp.num;
            if(vis[x]) continue;
            vis[x]=true;
            for(int i=head[x];i;i=e[i].nxt)
            {
                int y=e[i].to,v=e[i].v;
                if(dis[y]>dis[x]+v)
                {
                    dis[y]=dis[x]+v;
                    q.push((node){dis[y],y});
                }
            }
        }
    }
    int main()
    {
    	read(n),n++;
        t=n*n+1;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<n;++j)
            {
                int val;
                read(val);
                if(i==1) add(s,num(i,j),val);
                else if(i==n) add(num(i-1,j),t,val);
                else add(num(i-1,j),num(i,j),val);
            }
        }
        for(int i=1;i<n;++i)
        {
            for(int j=1;j<=n;++j)
            {
                int val;
                read(val);
                if(j==1) add(num(i,j),t,val);
                else if(j==n) add(s,num(i,j-1),val);
                else add(num(i,j),num(i,j-1),val);
            }
        }
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<n;++j)
            {
                int val;
                read(val);
                if(i==1) add(num(i,j),s,val);
                else if(i==n) add(t,num(i-1,j),val);
                else add(num(i,j),num(i-1,j),val);
            }
        }
        for(int i=1;i<n;++i)
        {
            for(int j=1;j<=n;++j)
            {
                int val;
                read(val);
                if(j==1) add(t,num(i,j),val);
                else if(j==n) add(num(i,j-1),s,val);
                else add(num(i,j-1),num(i,j),val);
            }
        }
        dijkstra();
        printf("%d",dis[t]);
    	return 0;
    }
    
    • 1

    信息

    ID
    1006
    时间
    2000ms
    内存
    250MiB
    难度
    6
    标签
    递交数
    1
    已通过
    1
    上传者