#include<stdio.h>
#include<stdlib.h>
int n,m,s,tmp=0,vis[10001]={0},dis[10001]={0},head[10001]={0};
struct edge{
int to,w,next;
}edge[100000];
void add(int x,int y,int z)
{
tmp++;
edge[tmp].to=y;
edge[tmp].w=z;
edge[tmp].next=head[x];
head[x]=tmp;
if(x==s&&(dis[y]>z||dis[y]==0))
dis[y]=z;
}
int main()
{
int x,y,z,i,j,u,min=2147483647;
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
dis[i]=2147483647;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dis[s]=0;vis[s]=1;
for(i=1;i<=n;i++)
{
min=2147483647;
for(j=1;j<=n;j++)
if(dis[j]<min&&!vis[j])
{
u=j;
min=dis[j];
}
vis[u]=1;
for(j=head[u];j;j=edge[j].next)
if(dis[edge[j].to]>dis[u]+edge[j].w)
dis[edge[j].to]=dis[u]+edge[j].w;
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
system("pause");
return 0;
#include<stdlib.h>
int n,m,s,tmp=0,vis[10001]={0},dis[10001]={0},head[10001]={0};
struct edge{
int to,w,next;
}edge[100000];
void add(int x,int y,int z)
{
tmp++;
edge[tmp].to=y;
edge[tmp].w=z;
edge[tmp].next=head[x];
head[x]=tmp;
if(x==s&&(dis[y]>z||dis[y]==0))
dis[y]=z;
}
int main()
{
int x,y,z,i,j,u,min=2147483647;
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
dis[i]=2147483647;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dis[s]=0;vis[s]=1;
for(i=1;i<=n;i++)
{
min=2147483647;
for(j=1;j<=n;j++)
if(dis[j]<min&&!vis[j])
{
u=j;
min=dis[j];
}
vis[u]=1;
for(j=head[u];j;j=edge[j].next)
if(dis[edge[j].to]>dis[u]+edge[j].w)
dis[edge[j].to]=dis[u]+edge[j].w;
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
system("pause");
return 0;
}
简单的加了前向星的dijkstra(之前只会用二维数组存储的我真是太菜了,下次考虑下堆优化)
前向星名字超好听的,也超有用的,edge[i].next代表上一个与x节点相连的序号(所以它是倒着搜的),head[x]记录着x节点连出去的最大的那个序号,并从这个序号一路找上去。