Extended Traffic

题目链接

题意:有n个路口,m条通路,如果经过一条路则会得到(终点 - 起点)^3的权值,求从1点到其他点的最小权值,如果权值小于3或无法到达输出‘?’。 题解:因为权值可能为负,所以用SPFA来解题,如果这个点在负环中的话那么最后的权值一定小于3,注意最后输出的时候的判断。注意边的数量,这道题巨坑,没有给范围,建议数组开到最大。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>

using namespace std;

const int maxn = 205;
const int INF = 1e9+7;

int head[maxn],num,n,m,a[maxn],ans[maxn],dis[maxn];

struct edge
{
    int to,next,w;
}s[1000000];

void add(int u,int v,int w)
{
    s[num].to = v;
    s[num].w = w;
    s[num].next = head[u];
    head[u] = num++;
}

void SPFA()
{
    int f[maxn],i,u,v,w;
    queue<int> q;
    for(i=1;i<=n;i++)
        dis[i] = INF;
    dis[1] = 0;
    q.push(1);
    memset(f,0,sizeof(f));
    memset(ans,0,sizeof(ans));
    f[1] = 1;
    ans[1] = 1;
    while(!q.empty())
    {
        u = q.front();
        //cout<<u<<endl;
        q.pop();
        f[u] = 0;
        for(i=head[u];i!=-1;i=s[i].next)
        {
            v = s[i].to;
            w = s[i].w;
            if(dis[u]+w<dis[v])
            {
                dis[v] = dis[u] + w;
                if(!f[v]&&ans[v]<=n)
                {
                    f[v] = 1;
                    ans[v]++;
                    q.push(v);
                }
            }
        }
    }
}

int main()
{
    int i,t,k = 1,u,v;
    scanf("%d",&t);
    while(t--)
    {
        num = 0;
        memset(head,-1,sizeof(head));
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            add(u,v,(a[v]-a[u])*(a[v]-a[u])*(a[v]-a[u]));
        }
        SPFA();
//        for(i=1;i<=n;i++)
//        {
//            printf("%d ",dis[i]);
//        }
//        printf("
");
        scanf("%d",&m);
        printf("Case %d:
",k++);
        while(m--)
        {
            scanf("%d",&u);
            if(dis[u]<3||dis[u]==INF||ans[u]>n)
                printf("?
");
            else
                printf("%d
",dis[u]);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/luoxiaoyi/p/9908039.html