REcheck 圖論基礎算法
阿新 • • 發佈:2017-11-04
訪問 == 表示 code pat 距離 基礎算法 () ext
真是搞懂了
聲明:
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]; } } }
REcheck 圖論基礎算法