次短路(第二最短路徑)
阿新 • • 發佈:2019-01-08
第二最短路徑
有句古話叫“不破不立”,這個思想跟次短路也就是第二最短路的思想一樣。
演算法思想:計算原圖的最短路,並儲存路徑。一一破壞最短路中的每一條邊,重新計算最短路,並排序。最小的那個就是第二最短路。
1.用dijkstra計算u->v的最短路徑,儲存路徑上的每條邊
2.依次刪除最短路徑上的每一條邊(每次刪一條),重新計算新的u->v最短路徑(新的最短路>=原最短路)
3.把所有新的最短路排序,最小的那個就是第二最短路(這裡存在第二最短路可能與原最短路相同,根據題目要求選擇即可)
#include <iostream> #define N 205 #define MAX 0x03fffffff using namespace std; int Metrix[N][N]; int dist[N]; int vist[N]; int path[N]; struct edge { int s,t,cost; }E[N]; void OutPath(int s,int t,int NV)//輸出路徑 { for(int i=1;i<=NV;i++) { cout<<path[i]<<" "; } cout<<endl; int u=s,v=t; while(v!=s) { cout<<v<<"-->"; v=path[v]; } cout<<u<<endl; } int Dijkstra(int s,int t,int NV) { int u=s,v=t; for(int i=1;i<=NV;i++) { dist[i]=MAX; vist[i]=0; } for(int i=1;i<=NV;i++) { path[i]=i; } dist[u]=0; for(int i=1;i<=NV;i++) { int min_value=MAX; for(int j=1;j<=NV;j++) { if(vist[j]==0&&dist[j]<min_value) { min_value=dist[j]; u=j; } } vist[u]=1; //cout<<u<<" "; for(int j=1;j<=NV;j++) { if(vist[j]==0&&dist[u]+Metrix[u][j]<dist[j]) { dist[j]=dist[u]+Metrix[u][j]; path[j]=u; } } } if(dist[t]==MAX)return -1; return dist[t]; } void SP2th(int s,int t,int NV)//NV為節點數 { int flag=Dijkstra(s,t,NV);//求最短路 if(flag==-1) { cout<<"不可達"<<endl; } else { int u=s,v=t,arcNum=0; while(v!=u)//儲存最短路到E[i] { cout<<v<<"-->"; E[arcNum].s=v; E[arcNum].t=path[v]; E[arcNum].cost=Metrix[v][path[v]]; arcNum++; v=path[v]; } cout<<u<<endl; cout<<":"<<dist[t]<<endl; int min_SP=MAX; for(int i=0;i<arcNum;i++) { //刪除E[i] u=E[i].s; v=E[i].t; Metrix[u][v]=Metrix[v][u]=MAX; flag=Dijkstra(s,t,NV);//重新計算最短路 if(flag==-1) { cout<<"不可達"<<endl; } else { OutPath(s,t,NV); cout<<":"<<dist[t]<<endl; if(min_SP>dist[t])min_SP=dist[t]; } Metrix[u][v]=Metrix[v][u]=E[i].cost; } cout<<"次短路:"<<min_SP<<endl; } } int main() { int m,n;//n為節點數,m為邊數 int s,t,c; while((cin>>n>>m)) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) { Metrix[i][j]=0; } else { Metrix[i][j]=MAX; Metrix[j][i]=MAX; } } } for(int i=0;i<m;i++)//每條路的代價 { cin>>s>>t>>c; if(c<=Metrix[t][s])Metrix[s][t]=Metrix[t][s]=c; } cin>>s>>t;//源和目的 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout<<Metrix[i][j]<<" "; } cout<<endl; } SP2th(s,t,n);<span style="font-family: Arial, Helvetica, sans-serif;">//求s->t的次短路</span> } return 0; }