sdnu oj 1223 Tom'problem A 最短路 spfa

①能否到达
②有无负环(回到过去)

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;

typedef long long ll;
const int N = 10006;
const int inf = 0x3f3f3f3f;

struct node
{
    int u, v, w, next;
}e[N];

int cnt;
int head[N], vis[N], dis[N], num[N];

void add(int u, int v, int w)
{
    e[cnt].u = u;
    e[cnt].v = v;
    e[cnt].w = w;
    e[cnt].next = head[u];
    head[u] = cnt++;
}

bool spfa(int s, int  n)
{
    queue<int> q;
    int i;
    for(i = 1; i < N; ++i)
        dis[i] = inf;
    q.push(s);
    dis[s] = 0;
    vis[s] = 1;
    num[s]++;
    while(!q.empty())
    {
        int x = q.front();
        q.pop();
        vis[x] = 0;
        for(i = head[x]; ~i; i = e[i].next)
        {
            int vv = e[i].v;
            if(dis[vv] > dis[e[i].u] + e[i].w)
            {
                dis[vv] = dis[e[i].u] + e[i].w;
                if(!vis[vv])
                {
                    vis[vv] = 1;
                    q.push(vv);
                    ++num[vv];
                    if(num[vv] > n)
                        return 0;
                }
            }
        }
    }
    return 1;
}
int main()
{
    int m, u, v, w, n;
    while(~scanf("%d%d", &m, &n))
    {
        cnt = 0;
        memset(head, -1, sizeof head);
        memset(vis, 0, sizeof vis);
        memset(e, 0, sizeof e);
        memset(num, 0, sizeof num);
        while(m--)
        {
            scanf("%d%d%d", &u, &v, &w);
            add(u, v, w);
            add(v, u, w);
        }
        if(!spfa(1, n) || dis[n] == inf)
            printf("IMPOSSIBLE!\n");
        else
            printf("%d\n", dis[n]);
    }
    return 0;
}

链式前向星
spfa

发布了40 篇原创文章 · 获赞 4 · 访问量 1129

猜你喜欢

转载自blog.csdn.net/xiongshuxian2019/article/details/104440398