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\n",mmin);
}
int main()
{
    scanf("%d%d",&n,&m);
    composition();
    if(n!=1&&m!=1)
    {
        dijkstra();
        printf("%d\n",d[ed]);
    }
    return 0;
}

 

posted @ 2017-10-11 21:38  AKCqhzdy  阅读(215)  评论(0编辑  收藏  举报