void Dijkstra(int v0)///求頂點到其他頂點的最短距離{ for(int i=0; i<n; i++) { dist[i]=Eage[v0][i]; vis[i]=0;///標記變量 } vis[v0]=1; dist[v0]=0;///將v0加入集合S for(int i=0; i<n-1; i++) ///從頂點v0確定n-1條最短路徑 { int min=INF,u=v0; for(int j=0; j<n; j++) { if(!vis[j]&&dist[j]<min) { u=j; min=dist[j]; } } vis[u]=1; for(int k=0; k<n; k++) { if(!vis[k]&&Eage[u][k]<INF&&dist[k]>dist[u]+Eage[u][k]) { dist[k]=dist[u]+Eage[u][k]; } } }}void bellman(int v0)///求頂點v0到其他頂點的最短距離{ for(int i= 0; i<n; i++) ///初始化 { dist[i]=Eage[v0][i]; } for(int k=1; k<n; k++) ///遞推n-1次 { for(int u=0; u<n; u++) ///修改每個頂點的dist[u] { if(u!=v0) { for(int j=0; j<n; j++) ///找u的鄰接點 { if(Eage[j][u]<INF&&dist[u]>dist[j]+Eage[j][u]) { dist[u]=dist[j]+Eage[j][u];///更新 } } } } }}void spfa(int v0){ for(int i=0; i<n; i++) ///初始化 { dist[i]=INF; vis[i]=0;///標記是否在隊列里 } queue<int >q; while(!q.empty())q.pop(); dist[v0]=0; vis[v0]=1; q.push(v0);///起點入隊列 while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=0; i<n; i++) { if(i!=u&&Eage[u][i]<INF)///鄰接點 { int v=i; if(dist[v]<dist[u]+Eage[u][v]) { dist[v]=dist[u]+Eage[u][v];///更新 if(!vis[v])///如果沒在隊列里 { vis[v]=1; q.push(v); } } } } }}void Floyd(){ for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { A[i][j]=Eage[i][j]; } } for(int k=0; k<n; k++) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(k==i||k==j)continue; if(A[i][k]+A[k][j]<A[i][j]) { A[i][j]=A[i][k]+A[k][j]; } } } }}
新聞熱點
疑難解答