题:https://codeforces.com/contest/1307/problem/D

题意:给定无向图,n为点,m为边。在给个k,为特殊点的数目,题目要求在这些特殊点上连一条边,让新图最短路尽可能大,问新图最短路(1到n)是多少?

分析:因为题目保证连通且原本的图一定可以从1到n,我们假设原本的图最短路为ans;

   易得虽然要求我们最大化最短路,但是加一条边只可能让答案不变或变小(因为一定要加这条边),不会使最短路变大;

   假设我们在特殊点x和y之间加了边,要是新图的最短路有走这条边,那么新图的最短路长度一定是p[x].t1+p[y].tn+1,p[].t1表示原本图以1为起点的最短路数组,p[].tn则是以n为起点;

   这里有个问题:那么是不是找到最大的t1和最大的tn相加就能得到最短路的?这个结论的错误的,有个简单的反例,假设图为一条链(1为链头,n为链尾),那么最大的t1和tn肯定就是n,长度为2(n-1)+1,但是点1和点n连起来后最短路就变成了1,而不是2(n-1)+1,这样的情况在更大的图中更有体现

   所以我们这里采用min(p[x].t1+p[y].tn+1,p[y].t1+p[x].tn+1),因为最短路,所以是要取其中较小的,化简一下就是p[x].t1-p[x].t2<p[y].t1-p[y].t2,取值小的x就作为1号点,y作为2号点,在代码中就体现为取max前面的t1,和当前的t2相加,取max到答案上;

   处理方法就是将k个点按照这个优先级来排序,那么当前的p[i].tn和i之前的t1组成的长度就是我们要的最短路,然后就贪心地把t1取成 i 之前最大的ti就行

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=;
int t1[MAXN],t2[MAXN];
struct qnode{
int v;
int c;
qnode(int _v=,int _c=):v(_v),c(_c){}
bool operator <(const qnode &r)const{
return c>r.c;
}
};
struct Edge{
int v,cost;
Edge(int _v=,int _cost=):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
bool vis[MAXN];
int dist[MAXN],vis1[MAXN],vis2[MAXN],pre[MAXN];
void Dij(int n,int start){
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)
dist[i]=INF;
priority_queue<qnode>que;
while(!que.empty())que.pop();
dist[start]=;
que.push(qnode(start,));
qnode tmp;
while(!que.empty()){
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=;i<E[u].size();i++){
int v=E[tmp.v][i].v;
int cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost){
dist[v]=dist[u]+cost;
que.push(qnode(v,dist[v])); }
}
}
}
void addedge(int u,int v,int w){
E[u].push_back(Edge(v,w));
}
struct node{
int t1,tn;
}p[MAXN];
bool cmp(int x,int y){
return p[x].t1+p[y].tn<p[x].tn+p[y].t1;
}
int a[MAXN];
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++){
scanf("%d",&a[i]);
}
while(m--){
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v,);
addedge(v,u,);
}
Dij(n,);
int ans=;
for(int i=;i<=n;i++)
p[i].t1=dist[i];///从1出发的最短路 Dij(n,n);
for(int i=;i<=n;i++)
p[i].tn=dist[i];///从n出发的最短路
sort(a+,a++k,cmp);
int maxx=p[a[]].t1;
for(int i=;i<=k;i++){
ans=max(ans,maxx+p[a[i]].tn+);
maxx=max(maxx,p[a[i]].t1);
}
printf("%d\n",min(ans,p[n].t1));
return ;
}

Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)的更多相关文章

  1. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  2. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  3. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  4. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  5. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  6. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  8. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  9. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

  10. Educational Codeforces Round 60 (Rated for Div. 2) 题解

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

随机推荐

  1. tkinter中控件menu的两种组织方法

    tkinter中,菜单控件组织方法有两种,使用中常出现混淆,为明晰各个正确用法,特整理撰写此博文.菜单控件的组织实际上是通过一个“母菜单”和“子菜单”构成,“母菜单”一方面与master连接(即与依附 ...

  2. MongoDB七-运维技术

    复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/03/08/2384571.html 这一篇我们以管理员的视角来看mongodb,作为一名 ...

  3. 08 SSM整合案例(企业权限管理系统):10.权限关联与控制

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 10.权限关联与控制 1.用户 ...

  4. vue学习(六)异步组件加载

    异步组件加载 首先准备-----简单的框架搭出来 <!DOCTYPE html> <html lang="zh-CN"> <head> < ...

  5. linux忘记密码

    linux忘记密码 Linux进入救援模式的方法 视频 centos6.5测试通过 如下 1.开机按esc进入下面界面 2.按e 3.按e 4.DM后空格加上single再回车 5.会回到这里再按b ...

  6. k8s资源pod yaml文件分析

    apiVersion: v1 kind: Pod_name metadata name: pod_name #描述Pod的名字 namespace: default #描述Pod所在命名空间,如果不设 ...

  7. docker-compose 安装 mongodb

    1. 修改 docker-compose.yml version: "2.1" services: php7.1: build: ./php image: php7.1-ext p ...

  8. Social GAN代码要点记录

    近日在阅读Social GAN文献的实验代码,加深对模型的理解,发现源代码的工程化很强,也比较适合构建实验模型的学习,故细致阅读.下文是笔者阅读中一些要点总结,有关于pytorch,也有关于模型自身的 ...

  9. Transaction Managament(事务管理一、概念)

    什么是事务 对于一个软件系统来说,我们需要相应的数据资源来保存体统状态.在对系统状态所依托的数据资源的时候,为了保证系统始终处于“正确”状态,我们必须对这些访问操作进行一些必要的限定.以保证系统状态的 ...

  10. 如何保障Assignment写作效率?

    有没有因为开学要交的Assignment而日夜赶工.身心俱疲啊?写Assignment确实是个体力+脑力活,要一直保持旺盛的精力并不容易.精神和身体的疲劳会慢慢分散你的注意力,进而影响效率和写作质量. ...