您的位置:首页 > 其它

次短路(第二最短路径)

2015-10-28 21:27 127 查看
第二最短路径

有句古话叫“不破不立”,这个思想跟次短路也就是第二最短路的思想一样。

算法思想:计算原图的最短路,并保存路径。一一破坏最短路中的每一条边,重新计算最短路,并排序。最小的那个就是第二最短路。

1.用dijkstra计算u->v的最短路径,保存路径上的每条边

2.依次删除最短路径上的每一条边(每次删一条),重新计算新的u->v最短路径(新的最短路>=原最短路)

3.把所有新的最短路排序,最小的那个就是第二最短路(这里存在第二最短路可能与原最短路相同,根据题目要求选择即可)

#include <iostream>
#define N 205
#define MAX 0x03fffffff
using namespace std;
int Metrix

;
int dist
;
int vist
;
int path
;

struct edge
{
int s,t,cost;
}E
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: