• spfa算法


    poj 3259

    ***spfa算法结合邻接表,可以处理一些带负权值的问题,处理最短路问题***

      

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <stack>
    #include <queue>
    
    using namespace std;
    #define oo 0x3f3f3f3f
    #define N 100010
    int a[N];
    int dist[N];
    int used[N];
    int vis[N];
    
    struct node
    {
        int u, v, len;
        int next;
    }maps[N];
    
    int k;
    int n, m, w, t;
    
    void Init()
    {
        k=1;
        memset(a, -1, sizeof(a));
        for(int i=1; i<=n; i++)
            dist[i]=oo;
        memset(used, 0, sizeof(used));
        memset(vis, 0, sizeof(vis));
    }
    
    void add(int u, int v, int len)//处理邻接表使用的函数
    {
        maps[k].u=u;
        maps[k].v=v;
        maps[k].len=len;
        maps[k].next=a[u];
        a[u]=k++;
    }
    
    int spfa()
    {
        queue<int> q;
        int start=1;
        q.push(start);
        dist[1]=0;
    
        used[1]=1;
        vis[1]=1;
        int v;
    
        while(!q.empty())
        {
            start=q.front();
            vis[start]=0;
            q.pop();
            for(int i=a[start]; i!=-1; i=maps[i].next)
            {
                v=maps[i].v;
                if(dist[v]>dist[start]+maps[i].len)
                {
                    dist[v]=dist[start]+maps[i].len;
                    if(vis[v]==1)
                        continue;
                    q.push(v);
                    used[v]++;
                    vis[v]=1;
                    if(used[v]>=n)
                        return 1;
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        scanf("%d", &t);
    
        while(t--)
        {
            scanf("%d%d%d", &n, &m, &w);
            Init();
            int u, v, len;
            for(int i=1; i<=m; i++)
            {
                scanf("%d%d%d", &u, &v, &len);
                add(u, v, len);
                add(v, u, len);
            }
            for(int i=1; i<=w; i++)
            {
                scanf("%d%d%d", &u, &v, &len);
                add(u, v, -len);
            }
    
            int ans=spfa();
    
            if(ans)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
    }
  • 相关阅读:
    HDU
    JQuery知识点总结
    html和css的使用方法以及样式
    面向对象五个基本原则
    【设计模式】【结构型模式】适配器模式
    为什么说Java中只有值传递?
    IntelliJ IDEA快捷键总结
    【设计模式】【创造型模式】单例模式
    【性能】定位现网环境中最耗费CPU的Java线程
    JavaWeb架构发展
  • 原文地址:https://www.cnblogs.com/9968jie/p/5658297.html
Copyright © 2020-2023  润新知