scu 4444 Travel
题意:
一个完全图,有n个点,其中m条边是权值为a的无向边,其它是权值为b的无向边,问从1到n的最短路。
思路:
首先判断1和n被哪种边连通。
如果是被a连通,那么就需要全部走b的边到达n,选择最小的;
被b连通,需要走全部为a的边到达n,选择最小的。
第二种情况,用输入的边跑dijkstra;
但是第一种情况边太多,所以并不能单纯的用最短路。
可以想到的是,对于第二种情况,一个点只会经过一次。
所以用一个set来存还未访问过的点,进行bfs。
每次从队列中取出一个点x,把set中与x以a边相连的点暂时去掉,那么此时set中就是与x以b边相连并且还未访问的点了,这个时候就可以进行松弛了。
之后再对set进行更新,使其为还未访问到的点。
又犯了这个睿智错误,数据还没输入就进行处理了,真是睿智。
自定义的比较宏比algor里面得到快很多啊。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#define mi(x,y) (x) > (y) ? (y) : (x)
using namespace std;
typedef long long ll;
const int N = 1e5 + ;
struct node
{
int to,cost;
node (int a,int b):to(a),cost(b){};
node(){};
};
struct js
{
int x;
ll d;
js(int a,ll b):x(a),d(b){};
js(){};
bool operator < (const js& y) const
{
return y.d < d;
}
};
vector<node> g[N];
int n,m,a,b;
ll dis[N];
void dij(void)
{
for (int i = ;i <= n;i++) dis[i] = 1e18;
dis[] = ;
priority_queue<js> pq;
pq.push(js(,));
while (!pq.empty())
{
js t = pq.top();pq.pop();
if (t.d > dis[t.x]) continue;
int x = t.x;
for (auto v:g[x])
{
if (dis[v.to] > dis[x] + v.cost)
{
dis[v.to] = dis[x] + v.cost;
pq.push(js(v.to,dis[v.to]));
}
}
}
}
void bfs(void)
{
set<int> s,t;
for (int i = ;i <= n;i++) s.insert(i);
queue<int> q;
q.push();
while (!q.empty())
{
int x = q.front();q.pop();
if (x == n) break;
for (auto v:g[x])
{
if (s.count(v.to) == ) continue;
s.erase(v.to);
t.insert(v.to);
}
for (auto y:s)
{
dis[y] = dis[x] + b;
q.push(y);
}
s.swap(t);
t.clear();
}
}
int main()
{
while (scanf("%d%d%d%d",&n,&m,&a,&b) != EOF)
{
for (int i = ;i <= n;i++)
{
g[i].clear();
}
bool f = ;
for (int i = ;i < m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if (x > y) swap(x,y);
g[x].push_back(node(y,a));
g[y].push_back(node(x,a));
if (x == && y == n) f = ;
}
ll ans;
if (f)
{
bfs();
ans = mi((ll)a,dis[n]);
}
else
{
dij();
ans = mi((ll)b,dis[n]);
}
printf("%lld\n",ans);
}
return ;
}
scu 4444 Travel的更多相关文章
- SCU 4444: Travel(最短路)
Travel The country frog lives in has n towns which are conveniently numbered by 1,2,…,n . Among n(n− ...
- SCU 4444 Travel (补图最短路)
Travel The country frog lives in has \(n\) towns which are conveniently numbered by \(1, 2, \dots, n ...
- 第十五届四川省省赛 SCU - 4444 Travel
给你一个一共由两种边的完全图 要求你求1到N的最短路 q队列为前沿队列(已探索过且最外围的点) p队列为未探索队列(未探索过的点) depth这个数组的用法并不是代表实际上这个点在第几层 而是防止死 ...
- SCU Travel
Travel The country frog lives in has n towns which are conveniently numbered by 1,2,…,n . Among n(n− ...
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- 图论 - Travel
Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n. Among n(n− ...
- ACM:SCU 4437 Carries - 水题
SCU 4437 Carries Time Limit:0MS Memory Limit:0KB 64bit IO Format:%lld & %llu Practice ...
- ACM: SCU 4438 Censor - KMP
SCU 4438 Censor Time Limit:0MS Memory Limit:0KB 64bit IO Format:%lld & %llu Practice D ...
- ACM: SCU 4440 Rectangle - 暴力
SCU 4440 Rectangle Time Limit:0MS Memory Limit:0KB 64bit IO Format:%lld & %llu Practic ...
随机推荐
- Eclipse实用小插件
MyBatipse插件 描述 用于mybatis的Dao层或者mapper层的方法直接跳到对应的xml文件对应的方法 安装 进入IDE(eclipse)的Help——>Install New S ...
- swift中 ?和 !的区别
可选类型(?)与强制解析运算符(!) ?是一种判断后再拆包的语法糖 !是一种强制拆包的语法糖 当你不确定有值的时候就可以用 ? 当你确定有值的时候可以用 ! ?的几种使用场景:1. ...
- u-boot 编译,启动流程分析,移植
分析u-boot-1.1.6 的启动流程 移植u-boot 2012.04版本到JZ2440开发板 源码百度云链接:https://pan.baidu.com/s/10VnxfDWBqJVGY3SCY ...
- 前端 HTML 常用标签 head标签相关内容 link标签
link标签 引入CSS样式文件 href="./index.css" CSS文件的路径 <!-- 引入CSS样式文件 --> <link rel="s ...
- 宝塔Linux面板安装Redis
宝塔Linux面板安装Redis不会特别麻烦,只要几步就可以实现:1.安装redis服务2.配置redis设置3.安装PHP扩展,下面就随ytkah一起来看看吧 1.首先,我们来安装redis服务,进 ...
- OC动画CABasicAnimation
//1.创建动画 CABasicAnimation *anima=[CABasicAnimation animationWithKeyPath:@"bounds"]; //1.1设 ...
- PHP 注册错误和异常处理机制
注册错误和异常处理机制有三个PHP函数需要学习 1. register_shutdown_function('Bootstrap\Library\Frame::fatalError'); 2. set ...
- 银联卡中关于CVN/CVN2/ICVN的区别
银联China Union Pay,是中国唯一合法的卡组织机构,同时也是EMVCo成员.关于银联卡中CVN/CVN2/ICVN的区别,刚开始我自己不了解,但经过查找资料和请教其他人,对它们的概念也渐渐 ...
- 基于Extjs+SpringMVC+MyBatis+Oracle的B/S信息系统简化开发思路
要在上层简化就得有下层强大的架构作为支撑,通过采用企业级的各种框架,虽然学习成本高一些,但用好了效率也自然高. 数据层简化: 首先所有表都有名称为ID的主键字段.有与表同名的序列作为自增key. 数据 ...
- 18-Python3 迭代器与生成器
2018-11-22 16:14:01 print('迭代器********************************************************************** ...