Extended Traffic LightOJ

//判断负环  在负环内的城市输出? 
#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
typedef long long LL;
const int N=4e5+10;
int abc[205];
int T,n,m,q;
int h[N],e[N],ne[N],w[N],idx;
int len(int u,int v){
    return (abc[v]-abc[u])*(abc[v]-abc[u])*(abc[v]-abc[u]);
}
void add(int a,int b)
{
    e[idx]=b;
    w[idx]=len(a,b);
    ne[idx]=h[a];
    h[a]=idx++;
}
int dist[205],st[205],times[205],cycle[205];
void spfa()
{
    memset(dist,125,sizeof(dist));
    memset(st,0,sizeof(st));
    memset(times,0,sizeof(times));
    memset(cycle,0,sizeof(cycle));
    queue<int>q;
    st[1]=times[1]=1;
    dist[1]=0;
    q.push(1);
    while(q.size())
    {
        int u=q.front();
        q.pop();
        st[u]=0;
        for(int i=h[u];~i;i=ne[i])
        {
            int v=e[i];
            if(cycle[v])
                continue;
            if(dist[v]-dist[u]>w[i])
            {
                dist[v]=dist[u]+w[i];
                if(!st[v])
                {
                    st[v]=1;
                    times[v]++;
                    q.push(v);
                }
                if(times[v]>n)
                    cycle[v]=1;
            } 
        }
    }
}
int main()
{
    cin>>T;
    for(int t=1;t<=T;t++)
    {
        idx=0;
        memset(h,-1,sizeof h);
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>abc[i];
        cin>>m;
        int a,b;
        while(m--)
        {
            cin>>a>>b;
            add(a,b);
        }
        spfa();
        cin>>q;
        printf("Case %d:
",t);
        while(q--)
        {
            cin>>a;
            if(dist[a]<3||dist[a]>=(int)1e9||cycle[a]) 
                printf("?
");
            else 
                printf("%d
",dist[a]);
        }
    }
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12236401.html