zoukankan      html  css  js  c++  java
  • bzoj1001: [BeiJing2006]狼抓兔子

    嗯被zory和哈老师联合D来学这个平面图转对偶图。。get√

    %%%%

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    struct node
    {
        int x,y,d,next;
    }a[6100000];int len,last[2100000];
    void ins(int x,int y,int dd)
    {
        len++;
        a[len].x=x;a[len].y=y;a[len].d=dd;
        a[len].next=last[x];last[x]=len;
    }
    typedef pair<int,int>P;
    int d[2100000],st,ed;
    void dijkstra()
    {
        priority_queue< P,vector<P>,greater<P> >q;
        memset(d,63,sizeof(d));d[st]=0;
        q.push(P(d[st],st));
        while(q.empty()==false)
        {
            P t=q.top();q.pop();
            int x=t.second;
            if(t.first>d[x])continue;
            for(int k=last[x];k;k=a[k].next)
            {
                int y=a[k].y;
                if(d[y]>d[x]+a[k].d)
                {
                    d[y]=d[x]+a[k].d;
                    q.push(P(d[y],y));
                }
            }
        }
    }
    int n,m;
    void composition()
    {
        int dd,mmin;
        st=2*(n-1)*(m-1)+1;
        ed=2*(n-1)*(m-1)+2;
        for(int i=1;i<=n;i++)  
            for(int j=1;j<m;j++)  
            {  
                scanf("%d",&dd);  
                if(mmin>dd)mmin=dd;  
                if(i==1)ins(j,ed,dd);  
                if(i>1&&i<n)  
                {  
                    ins((2*i-2)*(m-1)+j,(2*i-3)*(m-1)+j,dd);  
                    ins((2*i-3)*(m-1)+j,(2*i-2)*(m-1)+j,dd);  
                }  
                if(i==n)ins(st,(2*i-3)*(m-1)+j,dd);  
            }  
        for(int i=1;i<n;i++)  
            for(int j=1;j<=m;j++)  
            {  
                scanf("%d",&dd);  
                if(mmin>dd)mmin=dd;  
                if(j==1)ins(st,(2*i-1)*(m-1)+1,dd);  
                if(j>1&&j<m)  
                {  
                    ins((2*i-2)*(m-1)+j-1,(2*i-2)*(m-1)+m+j-1,dd);  
                    ins((2*i-2)*(m-1)+m+j-1,(2*i-2)*(m-1)+j-1,dd);  
                }  
                if(j==m)ins((2*i-1)*(m-1),ed,dd);  
            }  
        for(int i=1;i<n;i++)  
            for(int j=1;j<m;j++)  
            {  
                scanf("%d",&dd);  
                if(mmin>dd)mmin=dd;  
                ins((2*i-1)*(m-1)+j,(2*i-2)*(m-1)+j,dd);  
                ins((2*i-2)*(m-1)+j,(2*i-1)*(m-1)+j,dd);  
            }
        if(n==1||m==1)printf("%d
    ",mmin);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        composition();
        if(n!=1&&m!=1)
        {
            dijkstra();
            printf("%d
    ",d[ed]);
        }
        return 0;
    }
  • 相关阅读:
    LTE网络注册流程(1)(2)(3)
    Linux 添加用户
    (TOJ2627)台州学院首届新生程序设计竞赛参赛资格
    (TOJ1249)四数相加
    (TOJ1192)A + B Problem II
    (TOJ1065)完美数
    (TOJ1248)Encoding
    (TOJ1051)A × B problem
    (TOJ1506)Sort ZOJ7
    (TOJ1531)爱的伟大意义
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/7652995.html
Copyright © 2011-2022 走看看