题目描述:

  给定一个 n个点m 条边的带权无向连通图 ,以及一个大小为k 的关键点集合S 。有个人要从点s走到点t,现在可以对所有边加上一个非负整数a,问最大的a,使得加上a后,满足:s到t的最短路长度=s到t且只能经过S中的点的最短路长度。

题目分析:

  暴力

  记x为只经过关键点的最短路长度,其路径条数为n

  记y为可经过任意点的最短路长度,其路径条数为m

   tip:路径条数意思这里指 覆盖最短路的边数

  显然全部加上a之后最短路是不变的

  也就是说我们要求这个东西

$$a*n+x=a*m+y$$

$$a=(\frac{y-x}{n-m})_{max}$$

  所以我们怎么求这个东西呢

  当然是D(bao)P(li)咯

  假设f[i,j],g[i,j]表示到达i这个点,走过了j条边的最短路径

  其中f[i,j]只经过关键点,g[i,j]经过任意一点,这两个数组暴力DP就能求出来

  然后取出最大的a就好了

  关于无解的情况:上面那个式子的值<0显然是不行的,m=n显然是取任意的(当然实现的话就不用这样了判断,这样讲只是方便理解)

  代码:

  

 //许多大佬貌似喜欢在代码上面写自己id,那我这个蒟蒻也就从此开始——跟啦!
//好吧Koko不是重点
//LevenKoko
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define int long long
const int inf=1e18;
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-')f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}const int M=1e4+,N=1e3+;
int n,m,s,t,ans;
int head[N],nxt[M<<],ver[M<<],val[M<<],tot,f[N][N],g[N][N],a[M],k;
inline void add(int x,int y,int z){ver[++tot]=y,nxt[tot]=head[x],val[tot]=z,head[x]=tot;}
inline void Clear_All(){
memset(head,,sizeof(head));
memset(a,,sizeof(a));
for(int i=;i<=n;i++)for(int j=;j<=n;j++)f[i][j]=g[i][j]=inf;
tot=f[s][]=g[s][]=;ans=-;
}
inline void cmin(int &x,int y){return (void)(x=(x>y)?y:x);}
inline void cmax(int &x,int y){return (void)(x=(x>y)?x:y);}
inline void DP1(){
for(int i=;i<n;i++)
for(int j=;j<=n;j++)
if(f[j][i]<inf&&a[j])
for(int k=head[j];k;k=nxt[k])
cmin(f[ver[k]][i+],f[j][i]+val[k]);
}
inline void DP2(){
for(int i=;i<n;i++)
for(int j=;j<=n;j++)
if(g[j][i]<inf)
for(int k=head[j];k;k=nxt[k])
cmin(g[ver[k]][i+],g[j][i]+val[k]);
}
inline void Check_Get(){
for(int i=;i<=n;i++){
if(f[t][i]==inf) continue;
int j;
for(j=;j<=i;j++)
if(g[t][j]<f[t][i]) break;
if(j<=i) continue;
for(j=;j<i;j++) if(g[t][j]!=inf) break;
if(j>=i){
ans=inf; break;
}
int cur=inf;
for(j=;j<i;j++)
cur=min(cur,(-f[t][i]+g[t][j])/(i-j));
for(j=i+;j<=n;j++)
if(f[t][i]+i*cur>g[t][j]+j*cur) break;
if(j<=n) continue;
ans=max(ans,cur);
}
}
signed main(){
// freopen("ernd.in","r",stdin);
// freopen("ernd.out","w",stdout);
int T=read();
while(T--){
n=read(),m=read(),s=read(),t=read();Clear_All();
for(int i=,x,y,z;i<=m;i++)x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z);
k=read();
for(int i=,x;i<=k;i++) x=read(),a[x]=;
DP1();DP2();
Check_Get();
if(ans==-){puts("Impossible");continue;}
if(ans==inf){puts("Infinity");continue;}
printf("%lld\n",ans);
}
return ;
}

LOJ#6075. 「2017 山东一轮集训 Day6」重建的更多相关文章

  1. LOJ #6074. 「2017 山东一轮集训 Day6」子序列

    #6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...

  2. loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)

    题意 题目链接 Sol 设\(f[i][j]\)表示前\(i\)个位置中,以\(j\)为结尾的方案数. 转移的时候判断一下\(j\)是否和当前位置相同 然后发现可以用矩阵优化,可以分别求出前缀积和逆矩 ...

  3. loj#6076「2017 山东一轮集训 Day6」三元组 莫比乌斯反演 + 三元环计数

    题目大意: 给定\(a, b, c\),求\(\sum \limits_{i = 1}^a \sum \limits_{j = 1}^b \sum \limits_{k = 1}^c [(i, j) ...

  4. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  5. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

  6. Loj 6068. 「2017 山东一轮集训 Day4」棋盘

    Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...

  7. loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对   题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...

  8. LOJ #6119. 「2017 山东二轮集训 Day7」国王

    Description 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当 ...

  9. loj#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 主席树)

    题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需 ...

随机推荐

  1. NX二次开发-UFUN获得边的类型UF_MODL_ask_edge_type

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_modl.h> 6 #i ...

  2. 在jsp页面直接读取mysql数据库显示数据

    闲来无事,学学java,虽说编程语言相通,但是接触一门新知识还是有些疑惑,边学边记录,方便以后温故. 直接给出代码: <%@page import="java.sql.ResultSe ...

  3. word 文献标题自动编号

    来自:word中自动编号和多级编号的使用 选中标题或段落,点击鼠标右键,在编号菜单内选择适合的自动编号样式.或者在窗口上方的“开始”选项卡中选择编号样式.如果对已选的编号样式不满意,可以照以上方法直接 ...

  4. LeetCode刷题笔记-回溯法-括号生成

    题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "( ...

  5. 整理及优化CSS代码的7个原则

    作为网页设计师(前端工程师),你可能还记得曾经的那个网页大小建议:一个网页(包括HTML.CSS.Javacript.Flash和图片)尽量不要超过30KB的大小,随着互联网的日益庞大,网络带宽也在飞 ...

  6. 关于RSA加密和签名的区别与联系

    发现网上对于RSA加密和签名的介绍普遍偏向于使用和概念的说明,今天想说一点不一样的.对于加解密和签名的使用及概念就不再说了,不知道的请自行百度. 签名的本质其实就是加密,但是由于签名无需还原成明文,因 ...

  7. try-with-resources with JDBC

    I realize this was long ago answered but want to suggest an additional approach that avoids the nest ...

  8. struts使用

    下载文件 <action name="download" class="thirdIssueAction" method="getDownloa ...

  9. RAksmart服务器具备哪些特点?

    美国RAKsmart机房运营多年,前身是提供美国军用服务器业务,拥有着庞大的用户群体和消费者,那RAksmart服务器具备哪些特点呢? 1.美国raksmart服务器特点——硬盘超大 美国raksma ...

  10. Android开发 retrofit下载与上传

    前言 此博客只讲解retrofit下载与上传的使用,其实与其说是retrofit的下载与上传还不如说,依然是Okhttp的下载与上传.如果你需要了解retrofit入门请查看这篇博客(此博客不在详细讲 ...