题目
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入格式
第一行包含三个整数 n,m,s分别表示点的个数、有向边的个数、出发点的编号。
接下来 m 行每行包含三个整数 u,v,w 表示一条 u→v 的,长度为 w 的边。
输出格式
**输出一行 n 个整数,第 i 个表示 s 到第 i 个点的最短路径,若不能到达则输出 2147483647 **
解题思路
裸的单源路径最短路问题,数据也不是非常大,可以不用堆优化就可以AC。这里存图选择了链式前向星,好像用领接表存图会tle。
#include<iostream>
using namespace std;
int head[20000];
struct bian{
int to;
int w;
int next;
} a[1000000];
int n, m, s, cnt;
int vis[20000];
long long dis[20000];
void add(int u, int v, int w){
a[cnt].to = v;
a[cnt].w = w;
a[cnt].next = head[u];
head[u] = cnt++;
}
int main()
{
scanf("%d%d%d", &n, &m, &s);
for(int i=1;i<=n;i++) head[i] = -1;
for(int i=1;i<=n;i++) dis[i]=2147483647;
int u, v, w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
int qidian = s;
dis[s] = 0;
while(!vis[qidian])
{
vis[qidian]=1;
for(int i=head[qidian]; i!=-1 ; i=a[i].next)
{
if(!vis[a[i].to] && dis[a[i].to]>dis[qidian]+a[i].w)
{
dis[a[i].to] = dis[qidian]+a[i].w;
}
}
long long minn=2147483647;
for(int i=1;i<=n;i++)
{
if(!vis[i] && minn>dis[i])
{
qidian = i;
minn = dis[i];
}
}
}
for(int i=1;i<=n;i++)
{
printf("%lld ", dis[i]);
}
return 0;
}