• 最短路


    问题描述

    小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数以万计的好朋友沿路祝贺,导致小X在通过某些路不得不耗费1的时间来和他们聊天,尽管他希望尽早见到小C,所以他希望找到一条最快时间到达电影院的路。
    一开始小X在1号点,共有N个点,M条路,电影院为T号点。

    输入格式

    第一行3个正整数,分别为n,m和t。
    以下m行,每行3个数,表示连接的编号以及权值。
    (注意,可能会有重边)

    输出格式

    一行一个数,表示1到t的最短路。

    样例输入

    10 12 6

    3 9 2

    6 9 2

    6 2 1

    3 1 1

    1 9 2

    2 8 2

    7 10 1

    7 2 1

    10 0 1

    8 1 1

    1 5 2

    3 7 2

    样例输出

    4

    数据范围

    对于 30%的数据:n≤10,m≤20;
    对于 60%的数据:n≤1 000,m≤20 000;
    对于 100%的数据:n≤5 000 000,m≤10 000 000。

    题解

    小X要从结点1到结点T(电影院),经过每条路的时间为1,有时候在路上遇到好朋友要额外花费1的时间聊天(即通过有好朋友的路需要的时间为2)

    也就是说每条边的权值只能是1或2

    看了一下数据范围好大。。。

    SPFA是不是会TLE。。。

    能用bfs的条件为每条边的权值都为1,本题我们可以把权值为2的边拆成两条权值为1的边

    这样最多只会增加一倍的边,空间和时间都能接受

    然后这个图每条边的权值都是1,用bfs最早到达的就是最短路

    最后还要加上读入优化,数据很大没用读入优化还是会T

     1 #include <cstdio>
     2 #include <queue>
     3 using namespace std;
     4 int n,m,T,nn,fir[10000005],num,dis[10000005];
     5 struct node{
     6     int u,nex;
     7 }g[40000005]; 
     8 queue<int> q;
     9 bool vis[10000005];
    10 char ch;
    11 int read()
    12 {
    13     int s=0;
    14     ch=getchar();
    15     while (ch<'0' || ch>'9')
    16       ch=getchar();
    17     while (ch>='0' && ch<='9')
    18       s=s*10+ch-'0',
    19       ch=getchar();
    20     return s;
    21 }
    22 void add(int x,int y)
    23 {
    24     g[++num].u=y;  g[num].nex=fir[x];  fir[x]=num;
    25 }
    26 void bfs()
    27 {
    28     int u,k,v;
    29     q.push(1);
    30     vis[1]=1;
    31     while (!q.empty())
    32     {
    33         u=q.front();
    34         q.pop();
    35         for (k=fir[u];k;k=g[k].nex)
    36         {
    37             v=g[k].u;
    38             if (vis[v]) continue;
    39             vis[v]=1;
    40             dis[v]=dis[u]+1;
    41             if (v==T)
    42             {
    43                 printf("%d\n",dis[v]);
    44                 return;
    45             }
    46             q.push(v);
    47         }
    48     }
    49 }
    50 int main()
    51 {
    52     //scanf("%d%d%d",&n,&m,&T);
    53     n=read();  m=read();  T=read();
    54     int i,j,x,y,z;
    55     nn=n;
    56     for (i=1;i<=m;i++)
    57     {
    58         //scanf("%d%d%d",&x,&y,&z);
    59         x=read();  y=read();  z=read();
    60         if (z==1)
    61           add(x,y),add(y,x);
    62         else 
    63           nn++,
    64           add(x,nn),add(nn,x),
    65           add(nn,y),add(y,nn);
    66     }
    67     bfs();
    68     return 0;
    69 }
  • 相关阅读:
    【Objective-C学习笔记】变量和基本的数据类型
    数据文件实时同步(rsync + sersync2)
    入园自述
    软件工程人才的社会需求现状与发展趋势分析
    ERP-安心卡功能
    银盒宝成APP下载地址
    关于新商家后台添加商品后,一体机上不显示分类问题解决流程
    各类型商户微信认证方法
    网商微信实名认证FAQ
    扫码下单支持同桌单人点餐FAQ
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/15824098.html
Copyright © 2020-2023  润新知