zoukankan      html  css  js  c++  java
  • vijos 1423 最短路or环(有向图)

    最佳路线

    描述

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

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

  • 相关阅读:
    Silverlight搜索框 (Button inside TextBox)
    Silverlight的一个简单加载标志Loading...
    WCF “GenerateWcfClientFilesTask”任务意外失败
    C# 字符格式处理
    c# 链表结构(2)循环链表
    CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能【转】
    Silverlight监听属性变化
    浅谈HTTP中Get与Post的区别 [转]
    asp.net本质论——HttpModule
    web.config文件自定义配置节的使用方法的一个简单例子
  • 原文地址:https://www.cnblogs.com/zzqc/p/6854141.html
Copyright © 2011-2022 走看看