首先我们应该考虑的是如何将这个图中的每条有向边表示出来
刚开始大家肯定都会想到用二维数组,用坐标来写两个点间的距离,但这会造成时间和空间的巨大浪费,因此,我们就需要新型高效的方法来储存这些有向边——
1.链式前向星
struct edge
{
int next;
int to;
int val;
}a[maxn];
int head[maxn];//head[i]为i点的第一条边
int cnt=0;
void addedge(int u,int v,int w) //起点,终点,权值
{
a[++cnt].next=head[u];//更新cnt
a[cnt].to=v;
a[cnt].w=w;
head[u]=cnt;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y,z;
cin>>x>>y>>z;
addedge(x,y,z);
//如果是无向图,还要addedge(b,a,wei);
}
}
在得到每条有向(无向)边后,接下来就要开始遍历了,在遍历以x为起点的所有边时,只需要这样就行:
for(int i=head[pos];i!=0;i=a[i].next)
下面贴上遍历的代码:
//这里我们需要在全局变量里定义ans[maxn],用来记录源点到每个点的最短路程
int pos=s;
while(vis[pos]==0){
ll minn=inf;
vis[pos]=1;
for(int i=head[pos];i!=0;i=a[i].next){
if(vis[a[i].to]!=1&&ans[a[i].to]>ans[pos]+a[i].val)
ans[a[i].to]=ans[pos]+a[i].val;
}
for(int i=1;i<=n;i++)
if(ans[i]<minn&&vis[i]==0){
minn=ans[i];
pos=i;
}
}
最后输出你所需要位置的值即可。