题265.2022分队天梯赛训练-7-38 天梯地图 (30 分)

news/2024/7/15 17:01:46 标签: 算法, c++, 图论

文章目录

  • 题265.2022分队天梯赛训练-7-38 天梯地图 (30 分)
  • 一、题目
  • 二、题解


题265.2022分队天梯赛训练-7-38 天梯地图 (30 分)


一、题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、题解

本题其实就是要你解决两个问题,一个是求最快最短的路,,一个是求最短,途经节点数最少的路。说白了就是写两个双关键字的单源最短路算法就好。代码(这里单源最短路算法采用朴素dij)如下:

#include <bits/stdc++.h>

using namespace std;

const int maxn=510;
const int Inf=0x3f3f3f3f;

int N,M;
int d[maxn][maxn],t[maxn][maxn];
int d_dist[maxn],t_dist[maxn],num[maxn];
int collected[maxn];
int path[maxn];
int S,T;

int findMinTimedist()
{
    int minv,mindist=Inf;
    for(int v=0;v<N;v++)
    {
        if(!collected[v]&&t_dist[v]<mindist)
        {
            mindist=t_dist[v];
            minv=v;
        }
    }
    if(mindist==Inf)
    {
        return -1;
    }
    else
    {
        return minv;
    }
}

int findMinLendist()
{
    int minv,mindist=Inf;
    for(int v=0;v<N;v++)
    {
        if(!collected[v]&&d_dist[v]<mindist)
        {
            mindist=d_dist[v];
            minv=v;
        }
    }
    if(mindist==Inf)
    {
        return -1;
    }
    else
    {
        return minv;
    }
}

void dijkstra_time()//针对时间
{
    fill(collected,collected+maxn,0);
    fill(path,path+maxn,-1);
    for(int v=0;v<N;v++)
    {
        d_dist[v]=d[S][v];
        t_dist[v]=t[S][v];
        if(d[S][v]<Inf&&t[S][v]<Inf)
        {
            path[v]=S;
        }
    }
    d_dist[S]=0;
    t_dist[S]=0;
    path[S]=-1;
    while(1)
    {
        int v=findMinTimedist();
        if(v==-1)
        {
            break;
        }
        collected[v]=1;
        for(int w=0;w<N;w++)
        {
            if(!collected[w]&&d[v][w]<Inf&&t[v][w]<Inf)
            {
                if(t_dist[w]>t_dist[v]+t[v][w])
                {
                    t_dist[w]=t_dist[v]+t[v][w];
                    d_dist[w]=d_dist[v]+d[v][w];
                    path[w]=v;
                }
                else if(t_dist[w]==t_dist[v]+t[v][w]&&d_dist[w]>d_dist[v]+d[v][w])//时间相同看路径长度谁更小
                {
                    d_dist[w]=d_dist[v]+d[v][w];
                    path[w]=v;
                }
            }
        }
    }
}

void dijkstra_len()//针对路径长度
{
    fill(collected,collected+maxn,0);
    fill(path,path+maxn,-1);
    for(int v=0;v<N;v++)
    {
        d_dist[v]=d[S][v];
        if(d[S][v]<Inf&&t[S][v]<Inf)
        {
            path[v]=S;
            num[v]=num[S]+1;
        }
    }
    d_dist[S]=0;
    path[S]=-1;
    num[S]=0;
    while(1)
    {
        int v=findMinLendist();
        if(v==-1)
        {
            break;
        }
        collected[v]=1;
        for(int w=0;w<N;w++)
        {
            if(!collected[w]&&d[v][w]<Inf&&t[v][w]<Inf)
            {
                if(d_dist[w]>d_dist[v]+d[v][w])
                {
                    d_dist[w]=d_dist[v]+d[v][w];
                    num[w]=num[v]+1;
                    path[w]=v;
                }
                else if(d_dist[w]==d_dist[v]+d[v][w]&&num[w]>num[v]+1)//路径长度相同看途经节点数谁更小
                {
                    num[w]=num[v]+1;
                    path[w]=v;
                }
            }
        }
    }
}

int main()
{
    fill(d[0],d[0]+maxn*maxn,Inf);
    fill(t[0],t[0]+maxn*maxn,Inf);
    cin>>N>>M;
    for(int i=0;i<M;i++)
    {
        int v1,v2,flag,len,time;
        cin>>v1>>v2>>flag>>len>>time;
        d[v1][v2]=len;
        t[v1][v2]=time;
        if(!flag)
        {
            d[v2][v1]=len;
            t[v2][v1]=time;
        }
    }
    cin>>S>>T;
    vector<int> path1,path2;
    dijkstra_time();
    int now;
    now=T;
    path1.push_back(now);
    while(path[now]!=-1)
    {
        now=path[now];
        path1.push_back(now);
    }
    reverse(path1.begin(),path1.end());
    dijkstra_len();
    now=T;
    path2.push_back(now);
    while(path[now]!=-1)
    {
        now=path[now];
        path2.push_back(now);
    }
    reverse(path2.begin(),path2.end());
    if(path1==path2)
    {
        printf("Time = %d; Distance = %d:",t_dist[T],d_dist[T]);
        for(int i=0;i<path1.size();i++)
        {
            if(i>0)
            {
                printf(" =>");
            }
            printf(" %d",path1[i]);
        }
    }
    else
    {
        printf("Time = %d:",t_dist[T]);
        for(int i=0;i<path1.size();i++)
        {
            if(i>0)
            {
                printf(" =>");
            }
            printf(" %d",path1[i]);
        }
        putchar('\n');
        printf("Distance = %d:",d_dist[T]);
        for(int i=0;i<path2.size();i++)
        {
            if(i>0)
            {
                printf(" =>");
            }
            printf(" %d",path2[i]);
        }
    }
}


http://www.niftyadmin.cn/n/1061720.html

相关文章

面向对象三大特性 -- 继承,封装,多态

继承&#xff1a; 1、继承是面向对象程序设计能够提供软件开发效率的重要原因之一&#xff1b; 2、继承是具有传递性的&#xff1b; 3、继承来的属性和方法时隐式的&#xff0c;也就是在本类里面是看不见的&#xff1b; 4、一个类只能有一个父类&#xff0c;也就是只能单继承&a…

题266.2022分队天梯赛训练-7-39 直捣黄龙 (30 分)

文章目录题266.2022分队天梯赛训练-7-39 直捣黄龙 (30 分)一、题目二、题解题266.2022分队天梯赛训练-7-39 直捣黄龙 (30 分) 一、题目 二、题解 多关键字单源最短路&#xff0c;注意初始化&#xff0c;以及更新操作。 #include <bits/stdc.h>using namespace std;const …

PHP array_replace_recursive

1.函数的作用&#xff1a;比较键值&#xff0c;递归的替代数组中的元素 2.函数的参数: params array $array1 params array $array2 params array $array3 ... 3.例子&#xff1a; 1 <?php2 $arr1 [3 a > 1,4 b >5 [a > 2],6 c > 3,7 …

MySql和spring编码问题.

spring写数据到Mysql中出现乱码. 解决办法: <bean id"dataSource" destroy-method"close"class"org.apache.commons.dbcp.BasicDataSource"><property name"driverClassName" value"${jdbc.driverClassName}" />…

题267.2022分队天梯赛训练-7-40 最短工期 (25 分)

文章目录题267.2022分队天梯赛训练-7-40 最短工期 (25 分)一、题目二、题解题267.2022分队天梯赛训练-7-40 最短工期 (25 分) 一、题目 二、题解 考察关键路径算法的题目&#xff0c;套板子就好。 #include <bits/stdc.h>#define x first #define y secondusing namespac…

Ng第十八课:应用实例:图片文字识别(Application Example: Photo OCR)

18.1 问题描述和流程图 18.2 滑动窗口 18.3 获取大量数据和人工数据 18.4 上限分析&#xff1a;哪部分管道的接下去做 18.1 问题描述和流程图 图像文字识别应用所作的事是&#xff0c;从一张给定的图片中识别文字。这比从一份扫描文档中 识别文字要复杂的多。 为了完成这样…

分析app和wap手机网站的不同

随着手机3G、4G时代的到来,手机功能的越来越强大,手机App的市场是越来越火爆,时代在更新随之而来的事物也在更新,不能更上时代的步伐是落后的表现,所以不仅仅是手机APP在完善,手机网站WAP也在不断的改进中,可是app和wap手机网站有什么不同呢? 国互网从五大方面分析app和wap手机…

题268.2022分队天梯赛训练-7-41 哥尼斯堡的“七桥问题” (25 分)

文章目录题268.2022分队天梯赛训练-7-41 哥尼斯堡的“七桥问题” (25 分)一、题目二、题解题268.2022分队天梯赛训练-7-41 哥尼斯堡的“七桥问题” (25 分) 一、题目 二、题解 本题考察判断一个无向图是否具有欧拉回路&#xff0c;条件是图连通且所有的点度数为偶数。代码如下&…