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;
}
原文地址:https://www.cnblogs.com/dyzll/p/6790824.html