其他分享
首页 > 其他分享> > Coolest Ski Route

Coolest Ski Route

作者:互联网


求最长路,可以用spfa做, 数组要开到1e6,否则会超时

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
#define x first
#define y second
int ne[N], e[N], w[N], h[N], idx, in[N];
typedef pair<int, int> PII;
int n, m, dis[N];
bool vis[N];

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int Find_Max(int i)
{
    memset(vis, 0, sizeof vis);
    memset(dis, -0x3f, sizeof dis);
    queue<int> heap;
    dis[i] = 0;
    heap.push(i);
    vis[i] = 1;
    while(heap.size())
    {
        int t = heap.front();
        heap.pop();

        //int b = t.x, a = t.y;
        vis[t] = 0;
        for(int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dis[j] < dis[t] + w[i])
            {
                dis[j] = dis[t] + w[i];
                if(vis[j] == 0)
                {
                    heap.push(j);
                    vis[j] = 1;
                }
            }
        }
    }
    int e = -INF;
    for(int i = 1; i <= n; i++)
    e = max(e, dis[i]);
    return e;
}

int main()
{
    scanf("%d %d", &n, &m);
    int ans = -INF;
    memset(h, -1, sizeof h);
    while(m--)
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        add(a, b, c);
        in[b]++;
    }
    for(int i = 1; i <= n; i++)
    {
        if(in[i] == 0)
        {
            ans = max(Find_Max(i), ans);
        }
    }
    cout << ans << endl;
    return 0;
}

标签:idx,int,Route,ne,vis,heap,Ski,Coolest,dis
来源: https://www.cnblogs.com/Flying-bullet/p/16219084.html