博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SCU Travel
阅读量:4874 次
发布时间:2019-06-11

本文共 2228 字,大约阅读时间需要 7 分钟。

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 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define rep(i,m,n) for(i=m;i<=n;i++)#define mod 1000000007#define inf 0x3f3f3f3f#define vi vector
#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
#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
pq; pq.push(1); vis[1]=1; while(!pq.empty()) { int p=pq.front(); pq.pop(); for(int i=0;i
ok1,ok2; set
::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
d[p]+b) { d[*it]=d[p]+b; pq.push(*it); } } ok1.swap(ok2); ok2.clear(); } printf("%lld\n",d[n]); } return 0;}

转载于:https://www.cnblogs.com/dyzll/p/6790824.html

你可能感兴趣的文章
latex 学习笔记
查看>>
SQL 数据库 学习 005 学习必备的一些操作 --- 如何新建数据库 如何附加和分离数据库(如何备份还原数据库) 如何删除数据库...
查看>>
[php排错] Forbidden You don't have permission to access / on this server.
查看>>
MVC中的helper标签
查看>>
Spring Cloud Gateway入门
查看>>
XCode 4.2 新功能 - Storyboard
查看>>
Tomcat不保存SESSIONS.ser设置
查看>>
QEMU使用手册 - 2 QEMU计算机系统模拟器
查看>>
VIM技巧之去除代码行号并缩进代码
查看>>
自动化测试用例getText()获取某一个元素的值返回null或空
查看>>
大数智能未来
查看>>
virtualenv和virtualenvwrapper 的安装和使用
查看>>
MAC sublime text 无法自动补齐标签
查看>>
NgBook留言本开发全过程(1)
查看>>
LeetCode-指针法
查看>>
Python之路,Day12 - 那就做个堡垒机吧
查看>>
linux之shell之if、while、for语句介绍
查看>>
Mysql phpStudy升级Mysql版本,流产了怎么办?
查看>>
SQLServer之数据库行锁
查看>>
OFDM仿真
查看>>