我的代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n, m, st;
struct edge{
int to;
int q;
int next;
}e[500001];
int cnt, head[10001], s, now, minn;
long long dis[10001];
bool vis[10001];
void add(int u, int v, int w)
{
e[cnt++].to = v;
e[cnt].q = w;
e[cnt].next = head[u];
head[u] = cnt;
}
int main()
{
cin >> n >> m >> st;
for(int i = 1; i <= n; i++)
dis[i] = 2147483647;
dis[st] = 0;
for(int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
}
now = st;
while(!vis[now])
{
minn = 2147483647;
vis[now] = 1;
for(int i = head[now]; i; i = e[i].next)
if(!vis[e[i].to] && dis[e[i].to] > dis[now] + e[i].q)
dis[e[i].to] = dis[now] + e[i].q;
for(int i = 1; i <= n; i++)
{
if(dis[i] < minn && !vis[i])
{
minn = dis[i];
now = i;
}
}
}
for(int i = 1; i <= n; i++)
cout << dis[i] << ' ';
return 0;
}
题解代码:
#include<iostream>
using namespace std;
int head[100000],cnt;
long long ans[1000000];
bool vis[1000000];
int m,n,s;
struct edge
{
int to;
int nextt;
int wei;
}edge[1000000];
void addedge(int x,int y,int z)
{
edge[++cnt].to=y;
edge[cnt].wei=z;
edge[cnt].nextt=head[x];
head[x]=cnt;
}
int main()
{
cin>>m>>n>>s;
for(int i=1;i<=n;i++)
{
ans[i]=2147483647;
}
ans[s]=0;
for(int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
addedge(a,b,c);
}
int pos=s;
while(vis[pos]==0)
{
long long minn=2147483647;
vis[pos]=1;
for(int i=head[pos];i!=0;i=edge[i].nextt)
{
if(!vis[edge[i].to]&&ans[edge[i].to]>ans[pos]+edge[i].wei)
{
ans[edge[i].to]=ans[pos]+edge[i].wei;
}
}
for(int i=1;i<=m;i++)
{
if(ans[i]<minn&&vis[i]==0)
{
minn=ans[i];
pos=i;
}
}
}
for(int i=1;i<=m;i++)
{
cout<<ans[i]<<' ';
}
}