真是搞懂了
声明:
struct edge { int y,v,next; }e[maxn+100]; int link[maxn+100]; int len=0; void push(int xx,int yy,int vv){ e[++len].next=link[xx]; link[xx]=len;e[len].v=vv;e[len].y=yy;} int main() { F(i,1,n) { scanf("%d%d%d",&xx,&yy,&zz); push(xx,yy,zz); push(yy,xx,zz); } }
传包:
void floyed() { F(k,1,n) F(i,1,n) F(j,1,n) if(dis[i][k]+dis[k][j]<dis[i][j])//如果有一点k,使i-->k加上k-->j的路径比i-->j短则更新i~j的路径为更短的,并记录到path内 dis[i][j]=dis[i][k]+dis[k][j],path[i][j]=k; }
单源非负最短路径:
void dijkstra(int st) { F(i,1,n) dis[i]=a[st][i]; memset(vis,0,sizeof(vis)); vis[st]=1;dis[st]=0; F(i,1,n-1) { int maxn=INF; int k=0; F(j,1,n) { if((!vis[j])&&(dis[j]<maxn)) { maxn=dis[j]; k=j; } } if(k==0) return; vis[k]=1; F(j,1,n)//由于外层是i循环,k又被dis(表示st到dis[n]的距离)代替所以只用一层循环即可用floyed进行点的更新 { if(!vis[j]&&[k]+a[k][j]<dis[j])//如果到原点的最近点k加上k到j(1~n)比st到j距离还近(且未访问)的话则更新路径到更短的; dis[j]=dis[k]+a[k][j]; } } }
原文:http://www.cnblogs.com/Murs/p/7781123.html