codevs 1992 聚会
小S 想要从某地出发去同学k的家中参加一个party,但要有去有回。他想让所用的
时间尽量的短。但他又想知道从不同的点出发,来回的最短时间中最长的时间是多
少,这个任务就交给了你
第一行三个正整数n, m, k(n是节点个数,m是有向边的条数,k是参加聚会的地点
编号)( 1 ≤ n ≤ 1000 ,1 ≤ m ≤ 100,000)
第二行..m + 1行每行3个整数x,y,w 代表从x到y需要花w的时间 0<w<=100
输出从不同的节点出发的最短时间中最长的时间
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
10
#include <iostream>
#include <cstring> using namespace std; bool vis[];
int ans,n,m,k,i,j,x[],y[],w[],tot,dis1[],dis2[],atlas[][];
void Dijkstra1(int pos)
{
for(i=;i<=n;++i)
{
dis1[i]=atlas[pos][i];
vis[i]=;
}
vis[pos]=;
dis1[pos]=;
for(int k=;k<n;++k)
{
int minx=0x7fffffff,gx;
for(i=;i<=n;++i)
{
if(dis1[i]<minx&&!vis[i])
{
minx=dis1[i];gx=i;
}
}
vis[gx]=;
for(i=;i<=n;++i)
{
if(dis1[i]>atlas[gx][i]+dis1[gx])
dis1[i]=atlas[gx][i]+dis1[gx];
}
}
}
void Dijkstra2(int pos)
{
for(i=;i<=n;++i)
{
dis2[i]=atlas[pos][i];
vis[i]=;
}
vis[pos]=;
dis2[pos]=;
for(int k=;k<n;++k)
{
int minx=0x7fffffff,gx;
for(i=;i<=n;++i)
{
if(dis2[i]<minx&&!vis[i])
{
minx=dis2[i];gx=i;
}
}
vis[gx]=;
for(i=;i<=n;++i)
{
if(dis2[i]>atlas[gx][i]+dis2[gx])
dis2[i]=atlas[gx][i]+dis2[gx];
}
}
}
int main()
{
memset(atlas,,sizeof(atlas));
cin>>n>>m>>k;
int h=;
for(i=;i<=m;++i)
{
cin>>x[i]>>y[i]>>w[i];
h+=w[i];
atlas[x[i]][y[i]]=min(atlas[x[i]][y[i]],w[i]);
}
Dijkstra1(k);
memset(atlas,,sizeof(atlas));
for(i=;i<=m;++i)
atlas[y[i]][x[i]]=min(atlas[y[i]][x[i]],w[i]);
Dijkstra2(k);
for(i=;i<=n;++i)
{
if(dis1[i]<=h*&&dis2[i]<=h*)//相当于贪心一下,如果dis1好dis2值小于所有边权之和的两倍,代表连通。
ans=max(ans,dis1[i]+dis2[i]);
}
cout<<ans;
return ;
}
codevs 1992 聚会的更多相关文章
- T1992 聚会 codevs
http://codevs.cn/problem/1992/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小S 想要从某地 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
随机推荐
- linux中用管道实现兄弟进程通信
1 使用fork函数创建两个子进程.在第一个子进程中发送消息到第二个子进程,第二个子进程都出来并处理. 2 在父进程中,不适用管道通信,所以什么不需要做直接关闭勒管道的两端 3 代码实现 #inclu ...
- Flutter实战视频-移动电商-37.路由_Fluro引入和商品详细页建立
37.路由_Fluro引入和商品详细页建立 https://github.com/theyakka/fluro pages/details_page.dart新建页面 使用路由 先添加路由插件的引用 ...
- LeetCode: 557Reverse Words in a String III(easy)
题目: Given a string, you need to reverse the order of characters in each word within a sentence while ...
- Codeforces714B【读题-水】
题意: 给你n个数,然后让你自己选择X,先选择一些+一次:然后选择一些-一次. 思路: 首先要去判断是不是不需要处理或者处理一次的情况: 其实这样的话,你不可能选x然后最小和最大都加减一次,所以肯定是 ...
- Splay(区间翻转) 模板
洛谷:P3391 [模板]文艺平衡树(Splay) #include<cstdio> #include<iostream> #include<algorithm> ...
- 基于 Laravel 开发 ThinkSNS+ 中前端的抉择(webpack/Vue)踩坑日记
在上一篇文章< ThinkSNS+基于Laravel master分支,从1到 0,再到0.1>,简单的介绍了 ThinkSNS+ ,这里分享在开发过程中,前端选择的心理活动. Larav ...
- bzoj1139:[POI2009]Wie
传送门 状压dp,最短路 spfa似乎特别慢 代码: #include<cstdio> #include<iostream> #include<algorithm> ...
- 解决web项目无法部署到eclipse配置的本地tomcat
一.发现问题 在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并 ...
- 线段树-单点更新-HDU 1166 敌兵布阵
#include <iostream> #include <cstdio> #include <string> #include <cstring> u ...
- 2-1~3 MVC
2-1~3 MVC 内容简介 为什么需要mvc? 前端mvc的困难在哪里? AngularJS语境下的mvc是如何实现的? 1. 为什么需要mvc 代码规模越来越大,切分职责是大势所趋. 为了复用:很 ...