最佳路线

描述

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

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

3 6
1
1
2
1 2 3
2 3 5
3 1 1
3 2 1
2 1 10
1 3 15

样例输出1

13

样例2

样例输入2

3 4
1
1
2
1 2 4
1 3 5
2 3 5
3 2 10

样例输出2

-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. Centos7下添加Tomcat为系统服务

    文章参考:点击打开链接 因为个人感觉在centos中启动tomcat比较麻烦.要一直cd到目录下面startup.sh才可以,所以网上找到将tomcat作为系统服务,使用systemctl直接启动方法 ...

  2. ab命令压力测试

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...

  3. Python入门之面向对象之类继承与派生

    本章内容 一.继承 二.抽象类 三.继承的实现原理 ======================================================= 一.继承 1. 继承的定义 继承是一 ...

  4. C_Learning(2)

    /指针 /指针变量指向一个变量的地址 /给指针变量赋的值只能是地址 /指针变量的赋值 /{ int a; int *p; p=&a; } or { int a; int *p=&a; ...

  5. PHP安装包TS和NTS的区别

    原文链接:http://blog.csdn.net/zhuifengshenku/article/details/38796555 TS指Thread Safety,即线程安全,一般在IIS以ISAP ...

  6. windows10下使用source insight出现"source insight program editor已停止工作"的问题

    一.背景 1.1 OS 版本 windows 10 1.2 source insight版本 source insight 3.50.0034 二.解决方案 删除"我的文档"下面的source ins ...

  7. 【Tomca安装与启动】tomcatLinux环境安装与启动

    一.安装 1.下载tomcat安装包 2.解压安装包 3.配置环境变量 打开~/.bash_profile文件,输入一下两句话: export TOMCAT_HOME=/Users/enniu1/De ...

  8. 使用PDFminer3k解析pdf为文字遇到:WARING:root:GBK-EUC-H

    最近需要把PDF解析为文字,查了查python的模块,发现PDFminer3k能满足需求.我使用的是 windows平台下的python3.6,python2的则下载pdfminer. 首先下载:直接 ...

  9. Java自学入门新的体会0.2

    Java 基本数据类型 变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型数据. 因此,通过定义不 ...

  10. jerichotab 初始化页面显示tab页中的第一个

    tab初始化默认显示第一个内容,但是tab标签显示最后一个. 源代码: $.fn.initJerichoTab({ renderTo: '#consumable', uniqueId: 'jerich ...