最佳路线

描述

年久失修的赛道令国际汽联十分不满。汽联命令主办方立即对赛道进行调整,否则将取消其主办权。主办方当然必须马上开始行动。

赛道测评人员经过了三天三夜的数据采集,选出了若干可以使用的道路和各道路行驶所需的时间。这些道路包括若干直道和弯道,每个直道连接两个不同的弯道且为单向,两个弯道之间可能有多条直道,通过直道和弯道都需要一定的时间。主办方打算在这些可用道路中选出一部分作为赛道。赛道是由直道和弯道交替组成的一圈,赛道可多次经过同一条弯道,因为主办方可以通过架设立交桥的方法避免撞车。为了使比赛更加精彩,主办方希望选择一条单圈时间最短的赛道,由于观众席的位置在弯道1,所以赛道必须经过弯道1(赛道至少要包含一条直道)。

格式

输入格式

第一行是两个整数n,m(1<=n<=200,1<=m<=100000),分别表示弯道数和直道数。接下来n行,第i行是一个整数ai(1<=ai<=1000),表示通过第i个弯道所消耗的时间。接下来m行,第j行是三个整数xj,yj,bj(1<=xj,yj<=n,1<=bj<=1000),表示从弯道xj到弯道yj有一条单向直道,且通过该直道所消耗的时间为bj。

输出格式

一个整数s,表示单圈时间最短的赛道的单圈时间,若无解则输出-1。

样例1

样例输入1

  1. 3 6
  2. 1
  3. 1
  4. 2
  5. 1 2 3
  6. 2 3 5
  7. 3 1 1
  8. 3 2 1
  9. 2 1 10
  10. 1 3 15

样例输出1

  1. 13

样例2

样例输入2

  1. 3 4
  2. 1
  3. 1
  4. 2
  5. 1 2 4
  6. 1 3 5
  7. 2 3 5
  8. 3 2 10

样例输出2

  1. -1

限制

各个测试点1s

此题是有向边,且表明了1点一定在这个环中,youx两种解法。

一是用floyd求环,由于是有向边,所以不必担心i-->j与j-->i会经过同一个点(反证法如果存在这个点k那么显然k点比j更优)

注意在建边时把点权加在出度的边上这样求得的环的权值恰好正确;

所以可以先用floyd跑一下最短路,之后遍历(2,n)找到最小值

:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
int e[210][210];
int dis[210][210];
int w[210];
int main()
{
int n,m,i,j,k;
cin>>n>>m;
memset(e,inf,sizeof(e));
for(i=1;i<=n;++i) cin>>w[i],e[i][i]=0;
for(i=1;i<=m;++i){
int a,b,c;
cin>>a>>b>>c;
e[a][b]=min(e[a][b],c+w[a]);
}
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
int ans=inf;
for(i=2;i<=n;++i) ans=min(ans,e[1][i]+e[i][1]);
printf("%d\n",ans==inf?-1:ans);
return 0;
}

也可以用dij跑最短路只不过我写的前向星+heap两者时间效率竟然一样,但是数据大时floyd估计就gg了;

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
inline int read()
{
int r=0; char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') r=r*10+c-'0',c=getchar();
return r;
}
struct Heap
{
int u;
int w;
bool operator<(const Heap &chs)const{
return w>chs.w;}
};
struct Edge
{
int to;
int w;
int next;
}edges[100005];
int first[205];
int w[205];
int cnt,n;
int d[205];
bool vis[205];
void add(int a,int b,int c)
{
edges[cnt].w=c;
edges[cnt].to=b;
edges[cnt].next=first[a];
first[a]=cnt++;
}
int dij(int s,int e,int p)
{
memset(vis,0,sizeof(vis));
memset(d,inf,sizeof(d));
priority_queue<Heap> Q;
d[s]=0;
Q.push(Heap{s,0});
while(!Q.empty()){
Heap h=Q.top();Q.pop();
int u=h.u;
if(vis[u]) continue;
vis[u]=1;
if(u==e&&p==2) {return d[u];}
for(int i=first[u];i+1;i=edges[i].next){
Edge ee=edges[i];
if(d[ee.to]>d[u]+ee.w){
d[ee.to]=d[u]+ee.w;
Q.push(Heap{ee.to,d[ee.to]});
}
}
}
return inf;
}
int main()
{
int m,i,j,k;
int a,b,c;
int dd[205];
memset(first,-1,sizeof(first));
cnt=0;
cin>>n>>m;
for(i=1;i<=n;++i) w[i]=read();
for(i=1;i<=m;++i){
a=read(),b=read(),c=read();
add(a,b,c+w[a]);
} int ans=inf;
dij(1,1,1);
for(i=1;i<=n;++i) dd[i]=d[i];//,cout<<dd[i]<<endl;
//for(i=2;i<=n;++i)
//cout<<dij(i,1,2)<<endl;
for(i=2;i<=n;++i) ans=min(ans,dd[i]+dij(i,1,2));
printf("%d\n",(ans==inf?-1:ans));
return 0;
}

仔细想想的话,这只要跑一遍floyd最后e[1][1]中的就是答案,注意初始化全为inf即可(也可应用到求有向图的最小环中)

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int e[210][210];
int w[210];
int main()
{
int n,m,i,j,k;
cin>>n>>m;
memset(e,inf,sizeof(e));
for(i=1;i<=n;++i) cin>>w[i];
for(i=1;i<=m;++i){
int a,b,c;
cin>>a>>b>>c;
e[a][b]=min(e[a][b],c+w[a]);
}int ans=inf;
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
printf("%d\n",e[1][1]==inf?-1:e[1][1]);
return 0;
}

vijos 1423 最短路or环(有向图)的更多相关文章

  1. vijos:P1053Easy sssp(spfa判环)

    描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...

  2. POJ 1860 Currency Exchange 最短路+负环

    原题链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Tota ...

  3. poj2240 最短路判环

    题意:与poj1680一样,有不同的换钱渠道,可以完成特定两种货币的交换,并且有汇率,只不过此题是单向边,然后问是否能使财富增加 与poj1680一样,建图之后直接spfa判增值的环即可 #inclu ...

  4. poj3259 最短路判环

    题意:有一些点.一些道路和一些虫洞,道路是双向的,连接两点,花费正的时间,而虫洞是单向的,连接两点,可以使时间倒退,求是否能够回到过去. 只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走, ...

  5. poj1680 最短路判环

    题意:有多个银行可以换钱,每个银行可以将特定的两种钱相互兑换,并且有自己的汇率,现在问是否可以将自己的钱通过银行兑换增加. 其实比较水,主要就是知道最短路问题里的负环可以通过bellman-fold或 ...

  6. poj3259 Wormholes【最短路-bellman-负环】

    While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole ...

  7. POJ 3259 Wormholes 最短路+负环

    原题链接:http://poj.org/problem?id=3259 题意 有个很厉害的农民,它可以穿越虫洞去他的农场,当然他也可以通过道路,虫洞都是单向的,道路都是双向的,道路会花时间,虫洞会倒退 ...

  8. 51nod_1459 最短路 dijkstra 特调参数

    好多基础知识都没补完,只好看到.用到一个赶紧补全一个,并且保证下次需要的时候直接用,不用回来再补: 其实这个算法是在补同余最短路的时候用到的,当时突然发现理解算法导论上的原理甚至有效性证明,但是就是没 ...

  9. 【题解】Vijos1404 遭遇战(最短路图论套路)

    [题解]Vijos1404 遭遇战(最短路图论套路) 感觉一定要有建模的思想,不管什么东西要抽象建模之后再用算法解决... 求最短代价就可能可以用最短路,这句话不是强行解释,而是因为图论建模过后,可能 ...

随机推荐

  1. python基础五--dict

    一.昨日内容回顾 1. 列表: 增 insert:按照指定下标插入 append:在列表最后增加 extend:迭代式的增加到列表的最后,相当于列表扩展 删 pop:根据指定下标删除,返回删除的元素, ...

  2. ACM题目————STL练习之求次数

    题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=1112 描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个 ...

  3. jQuery 概述

    jQuery 概述 版权声明:未经博主授权,内容严禁分享转载! 什么是 JavaScript 类库 JavaScript 类库是指已经被封装好的一系列 JavaScript 函数,能够实现一些特定的功 ...

  4. centos 安装最新稳定版本docker

    直接yum安装的docker版本是 : docker --versionDocker version 1.12.6, build 85d7426/1.12.6 一些新特性需要安装最新的稳定版本 国内可 ...

  5. 20165310_java_blog_week1.md

    2165310 <Java程序设计>第1周学习总结 教材学习内容总结 了解Java基本配置环境 学习Java命名.编译.运行规则 拓展学习包的编译.运行 熟悉Git的运用方式 教材学习中的 ...

  6. RAM,ROM,NAND Flash,NOR Flash(A)

    他们四者相互独立 RAM掉电易失数据: RAM又分两种,一种是静态RAM,SRAM:一种是动态RAM,DRAM.前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM. DDR是Doubl ...

  7. linux下去掉pdf的密码(前提:知道密码)

    一.背景 Linux jello 4.16.3 SMP Thu Apr 19 07:32:02 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 二.去掉密码 2.1 先 ...

  8. 六角填数|2014年蓝桥杯B组题解析第七题-fishers

    六角填数 如图所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 思路 ...

  9. HDU 3404 Switch lights(Nim积)题解

    题意:在一个二维平面中,有n个灯亮着并告诉你坐标,每回合需要找到一个矩形,这个矩形xy坐标最大的那个角落的点必须是亮着的灯,然后我们把四个角落的灯状态反转,不能操作为败 思路:二维Nim积,看不懂啊, ...

  10. Oracle SQL Developer 中配置JDBC驱动程序连接

    此博客仅作为自己备忘,没有丝毫技术含量.把Postgres的JDBC驱动程序放在Oracle SQL Developer的JDBC的文件夹下,然后安装Oracle SQL Developer,添加新连 ...