zoukankan      html  css  js  c++  java
  • bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

    平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立

    加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~

    /**************************************************************
        Problem: 1001
        User: 96655
        Language: C++
        Result: Accepted
        Time:1724 ms
        Memory:95120 kb
    ****************************************************************/
     
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<iostream>
    #include<cstdlib>
    #include<queue>
    #include<map>
    #include<set>
    #include<vector>
    #include<cmath>
    #include<stack>
    #include<utility>
    using namespace std;
    const int maxn=1001000;
    const int INF=0x3f3f3f3f;
    struct Edge
    {
        int v,w,next;
    } edge[maxn*6];
    int head[maxn*2],p,n,m,y;
    void addedge(int u,int v,int w)
    {
        edge[p].w=w;
        edge[p].v=v;
        edge[p].next=head[u];
        head[u]=p++;
    }
    struct asd
    {
        int x,d;
        asd (int a,int b):x(a),d(b) {}
        bool operator<(const asd &e)const
        {
            return d>e.d;
        }
    };
    priority_queue<asd>q;
    int dis[maxn*2],vis[maxn*2];
    void Dijkstra(int s)
    {
        memset(vis,0,sizeof(vis));
        while(!q.empty())q.pop();
        for(int i=0; i<=y; i++)
            dis[i]=INF;
        dis[s]=0;
        q.push(asd(s,0));
        while(!q.empty())
        {
            asd e=q.top();
            q.pop();
            if(vis[e.x])continue;
            vis[e.x]=1;
            for(int i=head[e.x]; i!=-1; i=edge[i].next)
            {
                int v=edge[i].v;
                if(dis[v]>dis[e.x]+edge[i].w)
                {
                    dis[v]=dis[e.x]+edge[i].w;
                    q.push(asd(v,dis[v]));
                }
            }
        }
    }
    void read(int &x)
    {
        char c;
        while((c=getchar())<'0' || c>'9');
        x=c-'0';
        while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
    }
    int main()
    {
        read(n);
        read(m);
        if(n==1||m==1)
        {
            if(n>m)swap(n,m);
            int ans=INF,a;
            for(int i=1; i<m; i++)
            {
                scanf("%d",&a);
                ans=min(a,ans);
            }
            if(ans==INF)printf("0
    ");
            else printf("%d
    ",ans);
            return 0;
        }
        memset(head,-1,sizeof(head));
        p=0;
        y=(n-1)*(m-1)*2+1;
        int w,u,v;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<m; j++)
            {
                read(w);
                if(i==1)
                {
                    u=((i-1)*(m-1)+j)*2;
                    addedge(u,y,w);
                    addedge(y,u,w);
                }
                else if(i==n)
                {
                    u=((i-2)*(m-1)+j)*2-1;
                    addedge(0,u,w);
                }
                else
                {
                    u=((i-1)*(m-1)+j)*2;
                    v=((i-2)*(m-1)+j)*2-1;
                    addedge(u,v,w);
                    addedge(v,u,w);
     
                }
            }
        }
        for(int i=1; i<n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                read(w);
                if(j==1)
                {
                    u=((i-1)*(m-1)+j)*2-1;
                    addedge(0,u,w);
                    addedge(u,0,w);
     
                }
                else if(j==m)
                {
                    u=((i-1)*(m-1)+j-1)*2;
                    addedge(u,y,w);
                    addedge(y,u,w);
     
                }
                else
                {
                    u=((i-1)*(m-1)+j)*2-1;
                    v=((i-1)*(m-1)+j-1)*2;
                    addedge(u,v,w);
                    addedge(v,u,w);
     
                }
            }
        }
        for(int i=1; i<n; i++)
        {
            for(int j=1; j<m; j++)
            {
                read(w);
                u=((i-1)*(m-1)+j)*2-1;
                v=((i-1)*(m-1)+j)*2;
                addedge(u,v,w);
                addedge(v,u,w);
            }
        }
        Dijkstra(0);
        printf("%d
    ",dis[y]);
        return 0;
    }
    View Code
  • 相关阅读:
    PL/SQL Developer 远程连接oracle数据库
    Python 类与对象 __init__()参数
    微信公众号--发送模板消息
    微信公众号--进入菜单之前获取用户信息
    微信公众号-自定义菜单
    Java--时间转换
    微信公众号--被动回复用户消息
    {"errcode":40017,"errmsg":"invalid button type hint: [I8nq_a0783sha1]"}
    在使用XStream时没有processAnnotations方法
    在idea的控制台中中文显示为乱码
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/4931470.html
Copyright © 2011-2022 走看看