lightoj1074 最短路

题意:有n个城市,每个城市有拥挤值,有一些单向道路,从某个城市到另一个城市的花费是拥挤值差的三次方,当然可能是负的值。问从1点到某点最少的花费,若小于3或不能到达输出“?”

建图的边权是拥挤值差的三次方,跑一遍最短路然后按照询问输出就可以了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5
 6 int head[205],point[40005],val[40005],next[40005],size;
 7 int dist[205],l[205],t,s[205],n;
 8 bool vis[205],cir[205];
 9
10 void add(int a,int b,int v){
11     point[size]=b;
12     val[size]=v;
13     next[size]=head[a];
14     head[a]=size++;
15 }
16
17 void spfa(){
18     int i;
19     memset(dist,-1,sizeof(dist));
20     memset(vis,0,sizeof(vis));
21     memset(s,0,sizeof(s));
22     memset(cir,0,sizeof(cir));
23     dist[1]=0;
24     queue<int>q;
25     q.push(1);
26     vis[1]=1;
27     while(!q.empty()){
28         int u=q.front();
29         q.pop();
30         vis[u]=0;
31         if(s[u]>n){
32             cir[u]=1;
33             continue;
34         }
35         for(i=head[u];~i;i=next[i]){
36             int j=point[i];
37             if((dist[j]==-1||dist[j]>dist[u]+val[i])&&!cir[j]){
38                 dist[j]=dist[u]+val[i];
39                 if(!vis[j]){
40                     q.push(j);
41                     vis[j]=1;
42                     s[j]++;
43                 }
44             }
45         }
46     }
47     int m;
48     scanf("%d",&m);
49     for(i=1;i<=m;i++){
50         scanf("%d",&t);
51         if(!cir[t]&&dist[t]>=3)printf("%d\n",dist[t]);
52         else printf("?\n");
53     }
54 }
55
56 int main(){
57     int T;
58     while(scanf("%d",&T)!=EOF){
59         for(int q=1;q<=T;q++){
60             scanf("%d",&n);
61             int i;
62             for(i=1;i<=n;i++){
63                 scanf("%d",&l[i]);
64             }
65             memset(head,-1,sizeof(head));
66             size=0;
67             int m;
68             scanf("%d",&m);
69             for(i=1;i<=m;i++){
70                 int a,b;
71                 scanf("%d%d",&a,&b);
72                 int v=l[b]-l[a];
73                 v=v*v*v;
74                 add(a,b,v);
75             }
76             printf("Case %d:\n",q);
77             spfa();
78         }
79     }
80     return 0;
81 }

时间: 2024-10-09 12:48:46

lightoj1074 最短路的相关文章

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

LightOJ1074(spfa+dfs标记负环及负环能够到达的点)

题目链接:https://vjudge.net/problem/LightOJ-1074 题意:简化题意后就是给了一个有向图(不一定连通),n个点,m条有向边(边权可为负),求点1到其它点的最短路(其中不能到达的点或者最短距离<3的输出'?',其余的输出相应的最短路即可). 思路:因为有负权边,那么不能用dijkstra,可以用spfa来做,显然不可达的(dis[i]==inf)输出'?'即可,最短距离<3(dis[i]<3)的输出'?',另外负环上的点以及从负环能够到达的点都直接输出'

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是