【Gym - 100812G 】Short Path (SPFA)
BUPT2017 wintertraining(15) #7B
题意
n个点m条无向有权边(2 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5),每个点标记了0或1,求所有1中,最近的两个1的下标及距离。
题解
先用SPFA求出每个点离标记1的点最近的距离,d[i]。
同时记录下每个点最近的1的下标。
两个最近的1,要么是被一条边连着,要么是被几个0隔着的边连着。
我们通过寻找它们中间的边来找出它们。
枚举每条边,如果相邻都是1,或者都是0且最近的1不是同一个,或者一个1,一个0,那么这条边两个端点的最近1的距离,就可以拿来更新答案。
需要long long。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f3f3f3f3f
#define N 100005
#define ll long long
using namespace std;
typedef pair<ll,int> PII;
vector<PII> edge[N<<1];
int n,m,a[N];
ll d[N];
int near[N];
bool b[N];
queue <int> q;
void SPFA(){
for(int i=1;i<=n;++i)if(!d[i]) {
q.push(i);
b[i]=true;
near[i]=i;
}
while(!q.empty()){
int u=q.front(); q.pop(); b[u]=false;
for(int j=0;j<edge[u].size();++j){
int v = edge[u][j].second;
ll w = edge[u][j].first;
if(d[u]+w<d[v]){
d[v]=d[u]+w;
near[v]=near[u];
if(!b[v]){
q.push(v);
b[v]=true;
}
}
}
}
}
int main() {
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
d[i]=a[i]?0:inf;
}
for(int i=1;i<=m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
edge[u].push_back(make_pair(w,v));
edge[v].push_back(make_pair(w,u));
}
SPFA();
int ansa,ansb;
ll ans=inf;
for(int i=1;i<=n;++i)
for(int j=0;j<edge[i].size();++j){
int to = edge[i][j].second;
ll w = edge[i][j].first;
if(a[i]&&a[to]){
if(ans>w){
ans=w;
ansa=i;
ansb=to;
}
}else if(near[i]!=near[to]){
if(ans>d[i]+d[to]+w){
ans=d[i]+d[to]+w;
ansa=near[i];
ansb=near[to];
}
}
}
if(ans!=inf)printf("%lld\n%d %d",ans,ansa,ansb);
else puts("No luck at all");
return 0;
}
【Gym - 100812G 】Short Path (SPFA)的更多相关文章
- 【 Gym 101116K 】Mixing Bowls(dfs)
BUPT2017 wintertraining(15) #4H Gym - 101116K 题意 给定一个菜谱,大写的单词代表混合物,小写的代表基础原料.每个混合物由其它混合物或基础原料组成,不会间接 ...
- 【 Gym - 101124E 】Dance Party (数学)
BUPT2017 wintertraining(15) #4G Gym - 101124 E.Dance Party 题意 有c种颜色,每个颜色最多分配给两个人,有M个男士,F个女士,求至少一对男士同 ...
- 【 Gym - 101138F 】GukiZ Height (数学)
BUPT2017 wintertraining(15) #4 C Gym - 101138F 题意 初始高度0,目标值h,第i天目标值会下降i,当前高度会改变a[i%n],求高度不小于目标值的最早的时 ...
- 【POJ - 3126】Prime Path(bfs)
Prime Path 原文是English 这里直接上中文了 Descriptions: 给你两个四位的素数a,b.a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变.请你计算 ...
- 【Gym - 101002F】Mountain Scenes(dp)
Mountain Scenes Descriptions 给你一个长度为n的丝带,一个宽w一个高h 的 格子,用丝带去填充格子,这填充后只需要满足至少有一列的丝带长度与其他格子不同即可.丝带可以不全部 ...
- 【Win10 UWP】QQ SDK(二):SDK的回调处理
上一讲,我们介绍了QQ SDK的使用方法,请看<[Win10 UWP]QQ SDK(一):SDK基本使用方法> 一. 回调的基本形式 从前面的介绍中我们知道,我们的应用和QQ客户端之间需要 ...
- 【Win10 UWP】QQ SDK(一):SDK基本使用方法
每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...
- 【UOJ#242】【UR#16】破坏蛋糕(计算几何)
[UOJ#242][UR#16]破坏蛋糕(计算几何) 题面 UOJ 题解 为了方便,我们假定最后一条直线是从上往下穿过来的,比如说把它当成坐标系的\(y\)轴. 于是我们可以处理出所有交点,然后把它们 ...
- 【UOJ#386】【UNR#3】鸽子固定器(贪心)
[UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...
随机推荐
- poj2226 Muddy Fields 填充棒子(二分匹配)
参考博客:https://blog.csdn.net/liujc_/article/details/51287019 参考博客:https://blog.csdn.net/acdreamers/art ...
- [Offer收割]编程练习赛97
链接 [https://hihocoder.com/contest/offers97/problems] 题意 题目1 : 放置矩形 时间限制:10000ms 单点时限:1000ms 内存限制:256 ...
- iRate---一个跳转AppStore评分弹窗
https://www.aliyun.com/jiaocheng/357479.html 摘要:gitHub地址:https://github.com/nicklockwood/iRate可以通过配置 ...
- MySQL中关于数据类型指定宽度之后的情况
概述 MySQL有很多种数据类型,最常用的就是int,char,varchar,这些类型在创建表的时候都可以指定该字段的宽度,方法是在类型后面加一个括号,括号中写宽度就可以了. 但是,在指定宽度之后, ...
- 哈尔滨工程大学ACM预热赛
https://ac.nowcoder.com/acm/contest/554#question A #include <bits/stdc++.h> using namespace st ...
- MySQL :: Fatal error: Can't change to run as user 'mysql'. Please check that the user exists!
Fatal error: Can't change to run as user 'mysql'. Please check that the user exists! MySQL :: Fatal ...
- composer 自动加载类 通过psr
项目地址 git@github.com:brady-wang/composer.git "autoload":{ "classmap":[ "Lib ...
- Composer对于第三方包的自动加载
Composer提供了四种方式的支持,分别是 PSR-0和PSR-4的自动加载(我的一篇文章也有介绍过它们),生成class-map,和直接包含files的方式. PSR-4是composer推荐使用 ...
- syncthing 多主机同步文件工具
周五看了下阮一峰的blog 看到有一个 syncthing的小工具挺好用的 进行了简单的尝试: 1. 下载文件位置: https://syncthing.net 2. 下载文件后的简单安装 绿色版直接 ...
- Android——Activity的简绍
Activity Activity的运行机制其实和JavaEE中的servlet很像,而我们的Android系统也就相当与其servlet容器,Activity在其中进行创建实例.初始化.运行.销毁等 ...