首页 > 其他分享 >J - 【黄色】这题真的是模板题 Gym - 102072J 【 SPFA 】

J - 【黄色】这题真的是模板题 Gym - 102072J 【 SPFA 】

时间:2023-02-14 13:35:55浏览次数:69  
标签:102072J Gym vis 这题 cost que maxn ll lld

J - 【黄色】这题真的是模板题

 Gym - 102072J 

在看完其他出题人出的毒瘤题之后,良心出题人终于看不下去了,决定出一道模板题来送给大家一个AC,那么,你们能不能接住这个送来的AC呢?

给出一个nn个结点mm条边的带权有向图,若图中存在负权回路直接输出"-1",否则输出点ss到每个点的最短路的长度,如果ss点不连通,输出"NoPath"。

Input

第一行输入三个值n,m,s(2≤n≤1000,m≤105,1≤s≤N)n,m,s(2≤n≤1000,m≤105,1≤s≤N)

接下来m行,每行三个整数u,v,wu,v,w表示uu和vv之间有一条权值为ww的有向边(1<=u,v,s=N,−106<=w<=106)(1<=u,v,s=N,−106<=w<=106)。

Output

如果存在负权环,输出"-1"

否则输出nn行,分别表示ss点到ii点的最短路,如果s=is=i输出0。 

&&:裸的SPFA,只不过在这里题意说明的是只要存在负权回路就要输出 -1 , 这样就要判断一下如果不是和 s 点连通,就还要判断不连通的那段里面是否存在负权。
// Mercury_Lc
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll maxn = 2e5 + 10;
const ll inf = 0x3f3f3f3f;
struct Edge
{
    ll v;
    ll cost;
    Edge(ll _v = 0, ll _cost = 0) : v(_v),cost(_cost) {}
};
vector<Edge>E[maxn];
void addedge(ll u, ll v, ll w)
{
    E[u].push_back(Edge(v,w));
}
bool vis[maxn];
ll cnt[maxn];
ll dist[maxn];
bool spfa(ll start, ll n)
{
    memset(vis,false,sizeof(vis));
    for(ll i = 1; i <= n; i ++) dist[i] = inf;
    vis[start] = true;
    dist[start] = 0;
    queue<ll>que;
    while(!que.empty()) que.pop();
    que.push(start);
    memset(cnt,0,sizeof(cnt));
    cnt[start] = 1;
    while(!que.empty())
    {
        ll u = que.front();
        que.pop();
        vis[u] = false;
        for(ll i = 0; i < E[u].size(); i ++)
        {
            ll v = E[u][i].v;
            if(dist[v] > dist[u] + E[u][i].cost)
            {
                dist[v] = dist[u] + E[u][i].cost;
                if(!vis[v])
                {
                    vis[v] = true;
                    que.push(v);
                    if(++cnt[v] > n) return false;
                }
            }
        }
    }
    return true;
}
bool vs[maxn];
int main()
{
    ll n,m,s;
    while(~scanf("%lld %lld %lld", &n,&m, &s))
    {
        for(ll i = 0; i < m; i ++)
        {
            ll u,v,w;
            scanf("%lld %lld %lld", &u, &v, &w);
            addedge(u,v,w);
        }
        bool flag = spfa(s,n);
        if(!flag) printf("-1\n");
        else
        {
            int idx = 0;
            int last = 0;
            int y = 0;
            memset(vs,false,sizeof(vs));
            while(1)
            {
                for(int i = 1; i <= n; i ++)
                {
                    if(!vs[i])
                    {
                        if(dist[i]==inf)
                        {
                            idx = i;
                            vs[i] = true;
                            last = 1;
                            break;
                        }
                        else vs[i] = true;
                    }
                }
                bool xx = spfa(idx,n);
                if(!xx)
                {
                    printf("-1\n");
                    y = 1;
                    break;
                }
                if(last == 0) break;
                last = 0;
            }
            if(y == 0)
            {
                bool flag = spfa(s,n);
                for(ll i = 1; i <= n; i ++)
                {
                    if(s == i) printf("0\n");
                    else if(dist[i] == inf) printf("NoPath\n");
                    else printf("%lld\n",dist[i]);
                }
            }
        }
    }
    return 0;
}

 

标签:102072J,Gym,vis,这题,cost,que,maxn,ll,lld
From: https://blog.51cto.com/u_15965659/6056710

相关文章

  • Dumb feature Gym - 102020D 【 字典树 】
    D-Dumbfeature Gym-102020D  &:字典树的模板题,根据来的串建树,再查询。不过当时没弄出来,要映射一下子,把字母映射成键盘上的数字。ps:这题的数据应该是有问题,只......
  • Marvelous Necklace Gym - 102020M
    M-MarvelousNecklace Gym-102020M &:前缀和。#include<cstdio>#include<algorithm>#include<bits/stdc++.h>usingnamespacestd;typedeflonglongl......
  • 2018南京Gym - 101981J - Prime Game(计数)
    第一个元素的素因子2:它能贡献的区间有[1,1],[1,2],……,[1,10]10个区间第一个元素的素因子3:它能贡献的区间有[1,1],[1,2],……,[1,10]10个区间当前sum=10+10第二个元素......
  • gym102916 XXI Open Cup, Grand Prix of Samara
    A.Absenteeism这题是想的越多写的代码越少。首先根据题目中的约束,可以弄出一堆矩形,直接线段树加扫描线就行。其实不算难写。开始推性质,找简洁的做法。求的区间为\([x......
  • gym103469 XXII Open Cup, Grand Prix of IMO
    A.AND找到最小的值\(a\),如果存在\(x\anda\not=a\)无解。否则可以把\(a\)作为\(0\)使用,即在每两个数之间放上\(a\)。#include<bits/stdc++.h>usingnamespac......
  • @小小泡泡飘飘 看看 这题, 你会做吗 ?
    @小小泡泡飘飘  看看这题, 你会做吗? 这题一看就很高端,   不规则的三角形和角度,  什么勾股定理 、三角函数全都派不上用场,   我会做, ......
  • 这题 概率题 笑死
    数学吧  《我目前接触过最难的概率问题,完全无从下手》    https://tieba.baidu.com/p/8230026593   。 这题有点现实世界和自然科学建模的意思,......
  • GYM 101522 La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017
    C.Cheering题意:判断一个字符串中\(LSC\),\(PCMS\)哪个字符穿出现的次数多,如果一样多输出\(Tie\)思路:模拟就行signedmain(){std::strings;......
  • Gym - 103427J Luggage Lock
    Gym-103427JLuggageLock题解:BFS预处理+偏移首先我们考虑暴力做法,对于每次查询我们都去找出\(a_0a_1a_2a_3\)到\(b_0b_1b_2b_3\)的最小步骤,如果给你0000->9999,我们......
  • safety-gym 环境配置
    safety-gym safety-gym的安装还是相当繁琐的,这里记录一下如何在linux系统上配置safety-gym  1.到mojuco官网下载mujoco200的压缩包和密钥 mujoco200压缩......