zoukankan      html  css  js  c++  java
  • bzoj1001平面图最小割转对偶图最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=1001

    很明显的求对偶图的最短路即可(由于特判写错了一直wa = = )

    //#pragma comment(linker, "/stack:200000000")
    //#pragma GCC optimize("Ofast,no-stack-protector")
    //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    //#pragma GCC optimize("unroll-loops")
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pli pair<ll,int>
    #define pii pair<int,int>
    #define cd complex<double>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=2000000+10,maxn=8000000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
    
    struct edge{
        int to,Next;ll c;
    }e[maxn];
    int head[N],cnt;
    void init()
    {
        cnt=0;
        memset(head,-1,sizeof head);
    }
    void add(int u,int v,ll c)
    {
    //    printf("%d %d %lld
    ",u,v,c);
        e[cnt].to=v;
        e[cnt].c=c;
        e[cnt].Next=head[u];
        head[u]=cnt++;
    }
    priority_queue<pli,vector<pli>,greater<pli> >q;
    ll dis[N];
    void dij(int s)
    {
        for(int i=0;i<N;i++)dis[i]=1e18;
        dis[s]=0;
        q.push(mp(0,s));
        while(!q.empty())
        {
            pil u = q.top();q.pop();
            int x=u.se;
            if(dis[x]<u.fi)continue;
            for(int i=head[x];~i;i=e[i].Next)
            {
                int To=e[i].to;
                if(dis[To]>dis[x]+e[i].c)
                {
                    dis[To]=dis[x]+e[i].c;
                    q.push(mp(dis[To],To));
                }
            }
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int s=(n-1)*(m-1)*2,t=(n-1)*(m-1)*2+1;
        if(n<=1&&m<=1)return 0*puts("0");
        else if(n==1||m==1)
        {
            ll ans=1e18;
            for(int i=1;i<=(n==1?m-1:n-1);i++)
            {
                ll x;scanf("%lld",&x);
                ans=min(ans,x);
            }
            printf("%lld
    ",ans);
            return 0;
        }
        init();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m-1;j++)
            {
                ll x;scanf("%lld",&x);
                if(i==1)
                {
                    add(s,2*((i-1)*(m-1)+j-1),x);
                    add(2*((i-1)*(m-1)+j-1),s,x);
                }
                else if(i==n)
                {
                    add(t,2*((i-2)*(m-1)+j-1)+1,x);
                    add(2*((i-2)*(m-1)+j-1)+1,t,x);
                }
                else
                {
                    add(2*((i-2)*(m-1)+j-1)+1,2*((i-1)*(m-1)+j-1),x);
                    add(2*((i-1)*(m-1)+j-1),2*((i-2)*(m-1)+j-1)+1,x);
                }
            }
        }
        for(int i=1;i<=n-1;i++)
        {
            for(int j=1;j<=m;j++)
            {
                ll x;scanf("%lld",&x);
                if(j==1)
                {
                    add(t,2*((i-1)*(m-1))+1,x);
                    add(2*((i-1)*(m-1))+1,t,x);
                }
                else if(j==m)
                {
                    add(s,2*((i-1)*(m-1)+m-2),x);
                    add(2*((i-1)*(m-1)+m-2),s,x);
                }
                else
                {
                    add(2*((i-1)*(m-1)+j-2),2*((i-1)*(m-1)+j-1)+1,x);
                    add(2*((i-1)*(m-1)+j-1)+1,2*((i-1)*(m-1)+j-2),x);
                }
            }
        }
        for(int i=1;i<=n-1;i++)
        {
            for(int j=1;j<=m-1;j++)
            {
                ll x;scanf("%lld",&x);
                ll now=(i-1)*(m-1)+j-1;
                add(2*now,2*now+1,x);
                add(2*now+1,2*now,x);
            }
        }
        dij(s);
        printf("%lld
    ",dis[t]);
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    python3 练习题 day04
    python3 装饰器
    python3 生成器和生成器表达式
    python3 列表/字典/集合推导式
    python3 迭代器
    python3 day04 大纲
    ES6 的数值扩展
    ES6中的解构赋值
    ES6中 let与const 的区别
    react的基本配置安装及使用babel
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/8808385.html
Copyright © 2011-2022 走看看