LightOj1074 - Extended Traffic(SPFA最短路)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1074

题意:有n个城市,每个城市有一个拥堵值a[i],m条单向路u到v,从u到v所需时间是(a[v]-a[u])^3, q个查找,查找从起点1到点u的最短时间是多少;如果不能到达或者时间少于3输出-1;

可能存在负环,所以用spfa最合适。负环上的点是不能到达的,所以要注意;

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <string>
typedef long long LL;
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a))
#define N 515

using namespace std;

int G[N][N], cnt[N], n, vis[N], dist[N], a[N], flag;

void Init()
{
    flag = 0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
            G[i][j] = INF;
        G[i][i] = vis[i] = cnt[i] = 0;
        dist[i] = INF;
    }
}

void SPFA()
{
    cnt[1] = 1;
    dist[1] = 0;
    queue<int>Q;
    Q.push(1);
    vis[1] = 1;
    while(!Q.empty())
    {
        int p = Q.front();Q.pop();
        vis[p] = 0;

        if(cnt[p] > n*2)///说明存在负环,循环次数足够多,就可以让环上的点进队列的次数都大于n;
        {
            flag = 1;
            return ;
        }

        for(int i=1; i<=n; i++)
        {
            if(dist[i] > dist[p] + G[p][i])
            {
                dist[i] = dist[p] + G[p][i];
                if(!vis[i])
                {
                    vis[i] = 1;
                    cnt[i]++;
                    Q.push(i);
                }
            }
        }
    }
}

int main()
{
    int T, t = 1;
    scanf("%d", &T);
    while(T--)
    {
        int m, q, u, v;

        scanf("%d", &n);
        for(int i=1; i<=n; i++)
            scanf("%d", &a[i]);

        Init();

        scanf("%d", &m);
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d", &u, &v);
            G[u][v] = (a[v]-a[u])*(a[v]-a[u])*(a[v]-a[u]);
        }

        SPFA();

        scanf("%d", &q);

        printf("Case %d:\n", t++);

        while(q--)
        {
            scanf("%d", &u);
            if(cnt[u]<n && dist[u] != INF && dist[u]>=3)
                printf("%d\n", dist[u]);
            else
                printf("?\n");
        }
    }
    return 0;
}

时间: 2024-10-13 11:35:50

LightOj1074 - Extended Traffic(SPFA最短路)的相关文章

LightOJ 1074 Extended Traffic SPFA 消负环

分析:一看就是求最短路,然后用dij,果断错了一发,发现是3次方,有可能会出现负环 然后用spfa判负环,然后标记负环所有可达的点,被标记的点答案都是“?” #include<cstdio> #include<cstring> #include<queue> #include<cstdlib> #include<algorithm> #include<vector> #include<cmath> using namesp

LightOj 1074 Extended Traffic (spfa+负权环)

题目链接: http://lightoj.com/volume_showproblem.php?problem=1074 题目大意: 有一个大城市有n个十字交叉口,有m条路,城市十分拥挤,因此每一个路都有一个拥挤度,政府就出台了一个政策,对每一条路收取过路费,收取标准为(终点拥挤度 - 起点拥挤度 )3,,问每次询问m,输出1到m的最小花费,如果不能到达或者最小化费小于3的时候输出‘?’. 解题思路: 用spfa.标记负环. 1 #include <cstdio> 2 #include <

hdu 4568 spfa 最短路算法+旅行商问题

http://acm.hdu.edu.cn/showproblem.php?pid=4568 Problem Description One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could. The area can be represented a

LightOJ 1074 - Extended Traffic 【SPFA】

<题目链接> 题目大意:有n个城市,每一个城市有一个拥挤度Ai,从一个城市I到另一个城市J的时间为:(A(v)-A(u))^3.问从第一个城市到达第k个城市所花的时间,如果不能到达,或者时间小于3输出?否则输出所花的时间. 解题分析: 很明显,此题路段的权值可能为负,所以我们就不能用Dijkstra算法求最短路了.需要注意的是,当点存在负环的时候,就要将负环所能够到达的所有点全部标记,从起点到这些点的最短路是不存在的(因为假设如果存在最短路,那么只要途中在负环上多走几遍,那么重新算得的时间一定

LightOJ 1074 - Extended Traffic 【SPFA】(经典)

题目大意:有n个城市,每一个城市有一个拥挤度Ai,从一个城市I到另一个城市J的时间为:(A(v)-A(u))^3.问从第一个城市到达第k个城市所花的时间,如果不能到达,或者时间小于3输出?否则输出所花的时间. 解题分析: 很明显,此题路段的权值可能为负,所以我们就不能用Dijkstra算法求最短路了.需要注意的是,当点存在负环的时候,就要将负环所能够到达的所有点全部标记,从起点到这些点的最短路是不存在的(因为假设如果存在最短路,那么只要途中在负环上多走几遍,那么重新算得的时间一定会变少,所以不存

(简单) LightOJ 1074 Extended Traffic,SPFA+负环。

Description Dhaka city is getting crowded and noisy day by day. Certain roads always remain blocked in congestion. In order to convince people avoid shortest routes, and hence the crowded roads, to reach destination, the city authority has made a new

SPFA(负环) LightOJ 1074 Extended Traffic

题目传送门 题意:收过路费.如果最后的收费小于3或不能达到,输出'?'.否则输出到n点最小的过路费 分析:关键权值可为负,如果碰到负环是,小于3的约束条件不够,那么在得知有负环时,把这个环的点都标记下,DFS实现. #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 2e2 + 5; cons

HNU 13375 Flowery Trails (spfa最短路)

求最短路径覆盖的全部边权值和. 思路:分别从起点和终点两次求最短路,再比较两个点到起点的距离和他们之间的权值相加和是否等于最短路径. 这题很好 1 #include <cstring> 2 #include <cmath> 3 #include <queue> 4 #include <vector> 5 #include <cstdio> 6 #include <algorithm> 7 using namespace std; 8

poj1502 spfa最短路

1 //Accepted 320 KB 16 ms 2 //有n个顶点,边权用A表示 3 //给出下三角矩阵,求从一号顶点出发到各点的最短路的最大值 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace s