• [Swust OJ 582]--放学了,抢机子了(SPFA)


    题目链接:http://acm.swust.edu.cn/problem/0582/

    Time limit(ms): 5000        Memory limit(kb): 65535
     
    Description
    西南科技大学人数众多,学生多了附近的网吧也多。 
    很多同学都热衷于上网,虽然学校提供了开放机房,但由于各种原因导致大家去网吧的兴趣还高些。平时网吧的情况还好些,然而周末放假是绝好的时间,但是学校人多啊,一放学去网吧的人就开始狂奔,竞争之激烈,抢到机子的难度非常之大。往往在我们到达网吧之前都坐满了。 
    学校到网吧的路是错综复杂的,以致于到一个自己想去的网吧都有非常多的路线可以选择,而路线的长度又不相同,这样就决定了要花费的时间,因此想要尽快到达,选择一条最佳的线路是很有必要的。 
    为了简化问题,我们把学校与周边的网吧看做图中的顶点,学校与网吧,网吧与网吧之间的路线看做边,每个边都有一个权,表示我们走完这条路的时间,由于放学人流量大,如果反向走会有危险,因此这是一个有向图。 
    我的的学校在S点,想要去的网吧在T点。你的任务就是选择一条最佳路线,使得从学校到目的地网吧的时间最短,你只需要输出最短到达时间即可。
     
    Input
    共有M+2 行数据 
    第一行两个整数N,M,表示点数和边数。 
    然后M行每行3 个正整数(u,v,t),表示有一条可由u 到v耗时为t的边。 
    最后一行两个正整数S、T。 
    1< N <=10000,1<= M <=100000
     
    Output
    只有一行,一个整数表示最短时间。如果S、T之间不存在通路则输 
    出“No Solution!”(双引号不输出)。
     
    Sample Input
    4 4
    1 2 3
    2 4 10
    1 3 5
    3 4 5
    1 4

    Sample Output
    10

     
    解题思路:明显是求单源最短路径,时间不可能为负值吧,不存在负环,所以这里用SPFA(链接)可以轻松搞定Orz~~~
    代码如下:
     1 #include <iostream>
     2 #include <queue>
     3 #include <vector>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 #define maxn  10005
     8 #define inf 0x3f3f3f3f
     9 
    10 struct node{
    11     int v, w;
    12     node(int x, int y) :v(x), w(y){};
    13     node(){};
    14 };
    15 
    16 vector<node>mpt[maxn];
    17 //ptr判断一个点的入队操作次数,判断负环
    18 int vis[maxn], ptr[maxn], dis[maxn], t, n, m, u, v, w, s;
    19 
    20 int Spfa(int s){
    21     queue<int>Q;
    22     Q.push(s);
    23     vis[s] = 1, dis[s] = 0, ptr[s] = 1;
    24     while (!Q.empty()){
    25         int u = Q.front();
    26         Q.pop();
    27         vis[u] = 0;
    28         for (int i = 0; i<mpt[u].size(); i++){
    29             v = mpt[u][i].v;
    30             if (dis[v]>dis[u] + mpt[u][i].w){
    31                 dis[v] = dis[u] + mpt[u][i].w;
    32                 if (!vis[v]){
    33                     vis[v] = 1;
    34                     Q.push(v);
    35                     if (++ptr[v] > n) return 0;
    36                 }
    37             }
    38         }
    39     }
    40     return 1;
    41 }
    42 
    43 int main(){
    44     while (cin >> n >> m){
    45         memset(vis, 0, sizeof(vis));
    46         memset(dis, inf, sizeof(dis));
    47         memset(ptr, 0, sizeof(ptr));
    48         for (int i = 0; i < m; i++){
    49             cin >> u >> v >> w;
    50             mpt[u].push_back(node(v, w));
    51         }
    52         cin >> s >> t;
    53         if (Spfa(s))
    54             cout << dis[t] << endl;
    55         else
    56             cout << "No Solution!
    ";
    57     }
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    LDAP2-创建OU创建用户
    GNE: 4行代码实现新闻类网站通用爬虫
    为什么每一个爬虫工程师都应该学习 Kafka
    新闻网页通用抽取器GNEv0.04版更新,支持提取正文图片与源代码
    写了那么久的Python,你应该学会使用yield关键字了
    新闻类网页正文通用抽取器
    为什么Python 3.6以后字典有序并且效率更高?
    为什么你需要少看垃圾博客以及如何在Python里精确地四舍五入
    数据工程师妹子养成手记——数据库篇
    一行js代码识别Selenium+Webdriver及其应对方案
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4605607.html
Copyright © 2020-2023  润新知