zoukankan      html  css  js  c++  java
  • SCU Travel

    Travel

    The country frog lives in has n

    towns which are conveniently numbered by 1,2,,n

    .

    Among n(n1)2

    pairs of towns, m of them are connected by bidirectional highway, which needs a minutes to travel. The other pairs are connected by railway, which needs b

    minutes to travel.

    Find the minimum time to travel from town 1

    to town n

    .

    Input

    The input consists of multiple tests. For each test:

    The first line contains 4

    integers n,m,a,b (2n105,0m5105,1a,b109). Each of the following m lines contains 2 integers ui,vi, which denotes cities ui and vi are connected by highway. (1ui,vin,uivi

    ).

    Output

    For each test, write 1

    integer which denotes the minimum time.

    Sample Input

        3 2 1 3
        1 2
        2 3
        3 2 2 3
        1 2
        2 3

    Sample Output

        2
        3
    分析:
       补图最短路好题;
       题意为给一个图,原图的边权为a,补图的边权为b,求在完全图里1到n的最短路;

       首先1到n的最短路上的边权只全部由a或b构成;
       这样就是原图补图分别求1到n的最短路;
       原图bfs即可;
       补图考虑到到当前点只会更新和之前的点在原图上有边而和当前点无边的点的情况;
       这样更新后点是越来越少的,用set存点判断即可;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <bitset>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define sys system("pause")
    const int maxn=1e5+10;
    const int N=1e3+10;
    using namespace std;
    inline int id(int l,int r){return l+r|l!=r;}
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,k,t,a,b,vis[maxn];
    ll d[maxn];
    vi e[maxn];
    int main()
    {
        int i,j;
        while(~scanf("%d%d%d%d",&n,&m,&a,&b))
        {
            rep(i,1,n)e[i].clear(),d[i]=1e18,vis[i]=0;
            rep(i,1,m)scanf("%d%d",&j,&k),e[j].pb(k),e[k].pb(j);
            d[1]=0;
            queue<int>pq;
            pq.push(1);
            vis[1]=1;
            while(!pq.empty())
            {
                int p=pq.front();
                pq.pop();
                for(int i=0;i<e[p].size();i++)
                {
                    int to=e[p][i];
                    if(!vis[to])
                    {
                        vis[to]=1;
                        d[to]=d[p]+a;
                        pq.push(to);
                    }
                }
            }
            set<int>ok1,ok2;
            set<int>::iterator it;
            rep(i,2,n)ok1.insert(i);
            pq.push(1);
            while(!pq.empty())
            {
                int p=pq.front();
                pq.pop();
                for(int i=0;i<e[p].size();i++)
                {
                    int to=e[p][i];
                    if(ok1.find(to)!=ok1.end())
                    {
                        ok2.insert(to);
                        ok1.erase(to);
                    }
                }
                for(it=ok1.begin();it!=ok1.end();it++)
                {
                    if(d[*it]>d[p]+b)
                    {
                        d[*it]=d[p]+b;
                        pq.push(*it);
                    }
                }
                ok1.swap(ok2);
                ok2.clear();
            }
            printf("%lld
    ",d[n]);
        }
        return 0;
    }
  • 相关阅读:
    BZOJ 4236~4247 题解
    OCUI界面设计:滚动视图与分页控件初探
    大数乘法
    Effective C++ 11-17
    [Matlab+C/C++] 读写二进制文件
    Java 反射 方法调用
    如何使用LaTeX让自己不乱?
    LaTeX 相对于 Word 有什么优势?
    你在发表理科学术文章过程中有哪些经验值得借鉴?
    破译手势在对话中的意义
  • 原文地址:https://www.cnblogs.com/dyzll/p/6790824.html
Copyright © 2011-2022 走看看