[kuangbin带你飞]专题四 最短路练习 F POJ 3259

来源:互联网 发布:win10有线网络无法上网 编辑:程序博客网 时间:2024/05/16 14:25

题目地址:https://vjudge.net/contest/66569#problem/F

思路:spfa,以所有点为起点,各跑一次spfa,如果有环或者最后该起点的时间变小了,则返回true。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<vector>using namespace std;const int maxn=505;vector<pair<int,int> >E[maxn];int d[maxn];bool vis[maxn];int time[maxn];int n,m,w;bool spfa(){    for(int i=1;i<=n;i++)    {        for(int i=0;i<=n;i++)        {            d[i]=0x3f3f3f3f;            vis[i]=false;            time[i]=0;        }        queue<int>q;        q.push(i);        vis[i]=true;        d[i]=0;        while(!q.empty())        {            int now=q.front();            q.pop();            vis[now]=false;            time[now]++;            if(time[now]>n)                return true;            for(int i=0;i<E[now].size();i++)            {                int v=E[now][i].first;                if(d[v]>d[now]+E[now][i].second)                {                    d[v]=d[now]+E[now][i].second;                    if(vis[v])                        continue;                    q.push(v);                    vis[v]=true;                }            }        }        if(d[i]<0)            return true;    }    return false;}int main(){    int t;    scanf("%d",&t);    for(int casei=1;casei<=t;casei++)    {        for(int i=0;i<maxn;i++)            E[i].clear();    scanf("%d%d%d",&n,&m,&w);    for(int i=0;i<m;i++)    {        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        E[a].push_back(make_pair(b,c));        E[b].push_back(make_pair(a,c));    }    for(int i=0;i<w;i++)    {        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        E[a].push_back(make_pair(b,-c));    }    printf("%s\n",spfa()?"YES":"NO");    }}


0 0
原创粉丝点击