zoukankan      html  css  js  c++  java
  • luogu P1186 玛丽卡

    题目描述

    麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。

    因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。

    在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。

    麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。

    玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。

    编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。

    输入输出格式

    输入格式:

    第一行有两个用空格隔开的数N和M,分别表示城市的数量以及城市间道路的数量。1≤N≤1000,1≤M≤N*(N-1)/2。城市用数字1至N标识,麦克在城市1中,玛丽卡在城市N中。

    接下来的M行中每行包含三个用空格隔开的数A,B和V。其中1≤A,B≤N,1≤V≤1000。这些数字表示在A和城市B中间有一条双行道,并且在V分钟内是就能通过。

    输出格式:

    输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。

    输入输出样例

    输入样例#1:
    5 7
    1 2 8
    1 4 10
    2 3 9
    2 4 10
    2 5 1
    3 4 7
    3 5 10
    
    输出样例#1:
    27
    heap优化Dijkstra先求出无障碍最短路,
    再枚举当最短路上某一段障碍时情况
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    #define INF 0x3f3f3f3f
    #define N 1020
    
    int n,m;
    int head[N];
    int dis[N];
    
    struct nnode{
        int v;int w,next;
    }edge[N*N/2];
    struct node{
        int v,dis;
        friend bool operator < (node a,node b){
            return a.dis>b.dis;
        }
    }cur;
    priority_queue<node>q;
    
    int read() {
        int x=0,f=1;
        char c;
        while (c<'0' || c>'9') {if(c=='-')f = -1;c = getchar();}
        while (c>='0' && c<='9')x=x*10+c-'0',c=getchar();
        return x*f;
    }
    
    int num = 0;
    void add_edge(int x,int y,int w)
    {
        edge[num].v=y;
        edge[num].w=w;
        edge[num].next=head[x];
        head[x]=num++;
    }
    int pre_now[N];
    int pre[N];
    int Dijkstra(int p,int tp)
    {
        //memset (head,-1,sizeof -1);
        memset (dis,0x3f,sizeof dis);
        dis[1] = 0;
        q.push(node{1,0});
        while(!q.empty())
        {
            cur = q.top();
            q.pop();
            if(dis[cur.v]<cur.dis)continue;
            int u = cur.v;
            for (int i = head[u];i != -1;i = edge[i].next)
            {
                int v = edge[i].v;
                if((v == p && u== tp) || (v==tp && p == u))continue;
                if(dis[v]>dis[u]+edge[i].w)
                {
                    dis[v]=dis[u]+edge[i].w;
                    pre_now[v]=u;
                    q.push((node){v,dis[v]});
                }
            }
        }
        return dis[n];
    }
    
    int main() 
    {
        n = read();
        m = read();
        for(int i=1;i<=n;i++)head[i]=-1;    
        for (int i = 1; i <= m; i++){
            int a,b,c;
            a = read(),b = read(),c = read();
            add_edge(a,b,c);add_edge(b,a,c);
        }
        int ans=Dijkstra(0,0);
        memcpy(pre,pre_now,sizeof(pre));
        int k=n;
        while(k)
        {
            int tmp = Dijkstra(pre[k],k);
            if(tmp!=INF)
            ans = max(ans,tmp);
            k = pre[k];
        }
        
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    D365FO Debug找不到w3cp进程
    D365FO 10.0PU32 开发环境 Data Management导出失败
    一张图看懂项目管理
    用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
    敏捷考证?你应该知道的敏捷体系认证(最全名单)
    漫画:禅道程序员的一天
    敏捷开发管理--任务分解经验之谈
    漫画:优秀程序员的必备特质有哪些?
    漫画:女生/男生告白攻略
    漫画:程序员脱单秘籍
  • 原文地址:https://www.cnblogs.com/sssy/p/7040851.html
Copyright © 2011-2022 走看看