首先我们应该考虑的是如何将这个图中的每条有向边表示出来
刚开始大家肯定都会想到用二维数组,用坐标来写两个点间的距离,但这会造成时间和空间的巨大浪费,因此,我们就需要新型高效的方法来储存这些有向边——
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; } }
最后输出你所需要位置的值即可。