zoukankan      html  css  js  c++  java
  • TOJ--2674--最短路(spfa)

    厌死了......排位 晋级赛 两连跪 。。。

    三角形 的那题还是 无限WA  。。。

    还有 明天又要早起。。。

    先还是来看下这题吧 话说 好久没写 最短路了 --------- spfa 是我最喜欢的最短路版本

          touch me

    这题 其实相比其它的最短路 还是有个很让人看不懂的地方---让我纠结了很久

    首先 它告诉了我们城市的编号 是从 1~1000

    然后 又突然告诉我们 哪些城市和我们的出发地相邻 假如是 1 10 100.。。之类的

    最后 告诉我们 你想取哪些城市

    我就在想 起点呢!!! 你肯定是通过相邻的城市扩散出去..然后不断稀疏操作,,,,

    打完把LOL 我想到 下标0 TM的还没有用过它。。。

    题目 给点提示 不可以吗 作妹啊

    这题 我本来是想用 邻接表写的 但是因为这里2条路之间可能存在多条道路 所以要不断更新最短距离  所以 我就用map 二维数组来写了 主要是嫌太烦了 在输入的时候 得遍历一下起点或终点相邻边 找下有没有对应的点 我觉得这样每次一个for 好烦的。。。

    虽然 map二维数组 真的很浪费空间 时间  但这里为了简便

    其实 最开始 我是用floyd  可能因为结点数1000太多了吧 对于O(n^3) 而言   TLE了   或者 我写差了。。

    你用floyd AC了 麻烦 下面 给我留言让我看下 thanks

    关于 spfa 网上有很多介绍  而且 spfa 不难理解  只是不断的从队列中 取出一个结点 不断尝试地与它相邻结点进行稀疏操作 仅此而已

    啰嗦了一大堆 贴代码了

     1 #include <iostream>
     2 #include <queue>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int inf = 0x3f3f3f3f;
     8 const int size = 1010;
     9 
    10 int map[size][size];
    11 int dist[size];
    12 int go[size];
    13 bool vis[size];
    14 
    15 void spfa()
    16 {
    17     int i , now;
    18     memset(vis, false, sizeof(vis));
    19     for(i = 0; i < size; i++) 
    20         dist[i] = (i==0)?0:inf;
    21     queue<int>qe;
    22     while( !qe.empty() )
    23         qe.pop();
    24     qe.push(0);
    25     vis[0] = true;
    26     while(!qe.empty())
    27     {
    28         now = qe.front();
    29         for(i = 0; i < size; i++)
    30         {
    31             if(dist[i] > dist[now] + map[now][i])
    32             {
    33                 dist[i] = dist[now] + map[now][i];
    34                 if( !vis[i] )
    35                 {
    36                     qe.push(i);
    37                     vis[i] = true;
    38                 }
    39             }
    40         }    
    41         qe.pop();
    42         vis[now] = false;
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     int t , s ,d;
    49     int i , j , mmin;
    50     int next, st, end, len;
    51     while( ~scanf("%d %d %d", &t, &s, &d) )
    52     {
    53         for(i = 0; i < size; i++)
    54             for(j = 0; j <=i; j++)
    55                 if(i == j)
    56                     map[i][j] = 0;
    57                 else
    58                     map[i][j] = map[j][i] = inf;
    59         while(t--)
    60         {
    61             scanf("%d %d %d", &st, &end, &len); 
    62             if( len < map[st][end] )
    63                 map[st][end] = map[end][st] = len;
    64         }
    65         for(i = 0; i < s; i++)  
    66         {
    67             scanf("%d", &next);
    68             map[0][next] = map[next][0] = 0;
    69         }
    70         for(i = 0; i < d; i++)  
    71             scanf( "%d",&go[i] );
    72         spfa();
    73         mmin = inf;
    74         for(i = 0; i < d; i++)  
    75         {
    76             if( dist[ go[i] ] < mmin )
    77                 mmin = dist[ go[i]  ];
    78         }
    79         printf("%d
    ", mmin);
    80     }
    81     return 0;
    82 }
    View Code

    又已经是次日凌晨了~~

    just follow your heart
  • 相关阅读:
    中国身份证号码验证
    防止盗链下载问题
    Microsoft .NET Pet Shop 4 架构与技术分析
    常用操作封装类
    ASP.NET 2.0页面框架的几处变化
    普通字符串与HTML相互转换的小经验
    HttpWebRequest实现读取天气预报信息
    事务回滚 c# .net代码
    CAJViewer,AdobeReader等阅读器实现金山词霸屏幕取词功能
    01背包问题动态规划详解
  • 原文地址:https://www.cnblogs.com/radical/p/3790237.html
Copyright © 2011-2022 走看看