边表+SPFA
传说中效率很NB的单元最短路径算法,传说中时间复杂度为O(kE),k为长度,平均值为2,不知道这话是谁说的,一说流传oi界几年了
边表就是数组模拟邻接表,没学会很难,学会很简单的样子啊
#include <iostream> #include <cstring> #include <queue> using namespace std; struct edge { int v,w,next; }a[500001]; int link[10001],d[10001],n,m,s,X,Y,Z; bool v[10001]; queue<int>q; void add(int u,int v,int w) { static int p=0; p++; a[p].v=v; a[p].w=w; a[p].next=link[u]; link[u]=p; } int main() { cin >> n >> m >> s;//分别为顶点数 有向边数 源点 for(int i=1;i<=m;i++) { cin >> X >> Y >> Z;//是有向边 x->y 长度z add(X,Y,Z); } q.push(s); v[s]=true; memset(d,0x3F,sizeof(d)); d[s]=0; while(!q.empty()) { int x=q.front(); q.pop(); v[x]=false; for(int i=link[x];i!=0;i=a[i].next) { if(d[x]+a[i].w<d[a[i].v]) { d[a[i].v]=d[x]+a[i].w; if(v[a[i].v]==false) { v[a[i].v]=true; q.push(a[i].v); } } } } for(int i=1;i<=n;i++) { cout << d[i] << ' '; } return 0; }
233