zoukankan      html  css  js  c++  java
  • UVA 1376 Animal Run 最短路

    平面图最小割转最短路

    书上是说以边为结点建图

    但是我觉得好像以每块空白区域为结点建图会更自然点。把矩形的右上方编号为0,左下方编号为1,分别为起点终点

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    #define pb(a) push(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c) {
        return min(min(a,b),min(a,c));
    }
    template<class T> T max(const T& a,const T& b,const T& c) {
        return max(max(a,b),max(a,c));
    }
    void debug() {
    #ifdef ONLINE_JUDGE
    #else
    
        freopen("in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    int getch() {
        int ch;
        while((ch=getchar())!=EOF) {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    struct HeapNode
    {
        int d,u;
        bool operator < (const HeapNode &ant) const
        {
            return d>ant.d;
        }
    };
    struct Edge
    {
        int from,to;
        int dist;
    };
    const int maxn=2000005;
    struct Dijksta
    {
        int n;
        vector<int> g[maxn];
        vector<Edge> edge;
        int done[maxn];
        int d[maxn];
    
        void init(int n)
        {
            this->n=n;
            for(int i=0;i<=n;i++)
                g[i].clear();
            edge.clear();
        }
    
        void add(int u,int v,int w)
        {
            Edge e=(Edge){u,v,w};
            edge.push_back(e);
            g[u].push_back(edge.size()-1);
        }
    
        void solve(int s)
        {
            for(int i=0;i<=n;i++)
                d[i]=INF;
            memset(done,0,sizeof(done));
            d[s]=0;
            priority_queue<HeapNode> q;
            q.push((HeapNode){0,s});
            while(!q.empty())
            {
                HeapNode x=q.top();q.pop();
                if(done[x.u])continue;
                int u=x.u;
                done[u]=1;
                for(int i=0;i<g[u].size();i++)
                {
                    Edge &e=edge[g[u][i]];
                    if(d[u]+e.dist<d[e.to])
                    {
                        d[e.to]=d[u]+e.dist;
                        q.push((HeapNode){d[e.to],e.to});
                    }
                }
            }
        }
    };
    
    Dijksta solver;
    int n,m;
    int id[1005][1005][2];
    const int UP=0,DOWN=1;
    int vcnt;
    int ID(int a,int b,int d)
    {
        if(a<1||b>=m)return 0;
        if(a>=n||b<1)return 1;
        int &x=id[a][b][d];
        if(x==0)x=++vcnt;
        return x;
    }
    
    int main()
    {
        //freopen("d:\in1.txt","r",stdin);
        int ca=0;
        while(scanf("%d%d",&n,&m)!=EOF&&m)
        {
            solver.init(n*m*2+2);
            vcnt=2;
            memset(id,0,sizeof(id));
            //horizontal
            for(int i=1;i<=n;i++)
                for(int j=1;j<m;j++)
                {
                    int u,v,w;
                    scanf("%d",&w);
                    u=ID(i-1,j,DOWN);
                    v=ID(i,j,UP);
                    solver.add(u,v,w);
                    solver.add(v,u,w);
                }
    
            //vertical
            for(int i=1;i<n;i++)
                for(int j=1;j<=m;j++)
                {
                    int u,v,w;
                    scanf("%d",&w);
                    u=ID(i,j-1,UP);
                    v=ID(i,j,DOWN);
                    solver.add(u,v,w);
                    solver.add(v,u,w);
                }
            //diagonal
            for(int i=1;i<n;i++)
                for(int j=1;j<m;j++)
                {
                    int u,v,w;
                    scanf("%d",&w);
                    u=ID(i,j,UP);
                    v=ID(i,j,DOWN);
                    solver.add(u,v,w);
                    solver.add(v,u,w);
                }
            solver.solve(0);
            printf("Case %d: Minimum = %d
    ",++ca,solver.d[1]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/BMan/p/3632975.html
Copyright © 2011-2022 走看看