洛谷 P 3371 单元最短路

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入输出格式

输入格式:

第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

输出格式:

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

输入输出样例

输入样例#1:

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出样例#1:

0 2 4 3

说明

时空限制:1000ms,128M

数据规模:

对于20%的数据:N<=5,M<=15

对于40%的数据:N<=100,M<=10000

对于70%的数据:N<=1000,M<=100000

对于100%的数据:N<=10000,M<=500000

样例说明:

60分SPFA代码存档:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #define MAXN 2147483647
 6 #define N 10010
 7 using namespace std;
 8 struct node{
 9     int u,v,w;
10     int next;
11 }e[500010];
12 int n,m,s,head[N],dis[N],ei;
13 bool exist[N];
14 void add(int u,int v,int w){
15     e[++ei].u=u;e[ei].v=v;e[ei].w=w;
16     e[ei].next=head[u];head[u]=ei;
17 }
18 queue<int> q;
19 int main()
20 {
21     scanf("%d%d%d",&n,&m,&s);
22     memset(dis,0x3f3f3f3f,sizeof(dis));
23     memset(exist,false,sizeof(exist));
24     for(int i=1,x,y,z;i<=m;i++){
25         scanf("%d%d%d",&x,&y,&z);
26         add(x,y,z);
27     }
28     exist[s]=true;dis[s]=0;q.push(s);
29     while(!q.empty()){
30         int p=q.front();q.pop();exist[p]=false;
31         for(int i=head[p];i;i=e[i].next){
32             int v=e[i].v;
33             if(dis[v]>dis[p]+e[i].w){
34                 dis[v]=dis[p]+e[i].w;
35                 if(!exist[v]){
36                     q.push(v);
37                     exist[v]=true;
38                 }
39             }
40         }
41     }
42     for(int i=1;i<=n;i++){
43         if(dis[i]==0x3f) printf("%d ",MAXN);
44         else printf("%d ",dis[i]);
45     }
46     return 0;
47 }

head数组开大一点,就成90了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #define MAXN 2147483647
 6 #define N 10010
 7 using namespace std;
 8 struct node{
 9     int u,v,w;
10     int next;
11 }e[500010];
12 int n,m,s,head[500010],ei;
13 long long dis[N];
14 bool exist[N];
15 void add(int u,int v,int w){
16     e[++ei].u=u;e[ei].v=v;e[ei].w=w;
17     e[ei].next=head[u];head[u]=ei;
18 }
19 queue<int> q;
20 int main()
21 {
22     scanf("%d%d%d",&n,&m,&s);
23     memset(dis,0x3f3f3f3f,sizeof(dis));
24     memset(exist,false,sizeof(exist));
25     for(int i=1,x,y,z;i<=m;i++){
26         scanf("%d%d%d",&x,&y,&z);
27         add(x,y,z);
28     }
29     exist[s]=true;dis[s]=0;q.push(s);
30     while(!q.empty()){
31         int p=q.front();q.pop();exist[p]=false;
32         for(int i=head[p];i;i=e[i].next){
33             int v=e[i].v;
34             if(dis[v]>dis[p]+e[i].w){
35                 dis[v]=dis[p]+e[i].w;
36                 if(!exist[v]){
37                     q.push(v);
38                     exist[v]=true;
39                 }
40             }
41         }
42     }
43     for(int i=1;i<=n;i++){
44         if(dis[i]==0x3f3f3f3f) printf("%lld ",MAXN);
45         else printf("%lld ",dis[i]);
46     }
47     return 0;
48 }
时间: 2024-10-09 21:20:01

洛谷 P 3371 单元最短路的相关文章

洛谷P1850 换教室 最短路 + 动态规划

洛谷P1850 换教室最短路 + 动态规划 题解 首先预处理出任意两点的最短路 然后 dp f[ i ][ j ][ 0/1 ] 现在是 第 i 个时间段,已经申请 过 j次了,该次是否成功 0 否 1 成功 的最小的期望 主要是四个方面的转移 前一个是否申请 成功 or失败 当前是否申请 成功or失败 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ;

洛谷P1144 最短路计数(SPFA)

To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输

洛谷 1144 最短路计数 bfs

洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 100000 + 500;

洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

洛谷P1462 通往奥格瑞玛的道路二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点那么说明不符合要求 需要加大答案 时间复杂度 (log答案)* Ek 需要注意如果本来就不能到达 那么直接输出AFK 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using

洛谷P2832 行路难 分析+题解代码【玄学最短路】

洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座山,只能单向通过,并会耗费小X一定时间. 小X现在在1号山,他的目的是n号山,因为那里有火车站. 然而小X的体力是有限的.他每通过一条羊肠小道,就会变得更疲劳,导致他通过任意一条羊肠小道的时间都增加1. 输入格式: 第一行两个数,n,m 第2行到第m+1行,每行3个数A,B,C,表示A.B之间有一条

洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS&#39;s

P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题目描述 Farmer John has recently purchased a new car online, but in his haste he accidentally clicked the "Submit" button twice when selecting extra features for the car, and as a result the car ended up equip

洛谷1828 香甜的黄油

洛谷1828 香甜的黄油 本题地址:http://www.luogu.org/problem/show?pid=1828 题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费用在奶牛上. 农夫John很狡猾.像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场.他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶. 农夫Joh

洛谷P1462 通往奥格瑞玛的道路

P1462 通往奥格瑞玛的道路 219通过 1.2K提交 题目提供者gconeice 标签二分图论洛谷原创 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 RE好多.. 到底怎么判断AFK啊 看不懂题目.. 建议修改题目 究竟是血量为负算挂还是生命… 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,

[NOI2010] [洛谷P2046] 海拔 [50&#39;]

题目描述 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向 道路连接主干道上两个相邻的交叉路口.下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路.小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向