문제에 대한 해결 방법 [P1807] 루오 구 긴 도로 _NOI 가이드 2010 증가 (07)

얼굴 질문

문제 해결

가장 긴 도로 템플릿입니다.

가장 상징적 인 변화 그것의 템플릿에 그냥 단락 \ (+ \) 에 할당 된 초기 값 \ (--1 \) 가 될 수 있습니다.

대부분의 단락에 부정적인 루프는 없었다처럼주의, 그렇지 않으면 가장 긴 도로에 더 긍정적 링이 없었다, 단방향 측 있어야합니다.

만 사용 \ (SPFA \)를 작성.

(어쨌든, 항상 사람들이 암 카드의 화제가

코드

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <queue>
#define itn int
#define gI gi

using namespace std;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
    return f * x;
}

int n, m, tot, head[200003], nxt[200003], edge[200003], ver[200003];
int dis[200003], vis[200003];

inline void add(int u, int v, int w)
{
    ver[++tot] = v, edge[tot] = w, nxt[tot] = head[u], head[u] = tot;
} 

inline void SPFA()//真正的SPFA
{
    queue <int> q;
    q.push(1);
    dis[1] = 0;
    vis[1] = 1;
    while (!q.empty())
    {
        int u = q.front(); q.pop();
        vis[u] = 0;
        for (int i = head[u]; i; i = nxt[i])
        {
            int v = ver[i], w = edge[i];
            if (dis[v] < dis[u] + w)//注意符号
            {
                dis[v] = dis[u] + w;
                if (!vis[v]) {q.push(v); vis[v] = 1;}
            }
        }
    } 
}

int main()
{
    n = gi(), m = gI();
    for (int i = 1; i <= m; i+=1)
    {
        int u = gi(), v = gI(), w = gi();
        add(u, v, w);//单向边
    }
    memset(dis, -1, sizeof(dis));//赋初值
    SPFA();
    printf("%d\n", dis[n]);
    return 0;
}

추천

출처www.cnblogs.com/xsl19/p/11331306.html