0
点赞
收藏
分享

微信扫一扫

Dijkstra+暴力

炽凤亮尧 2022-09-19 阅读 84


单源最短路+暴力
记录最短路的路径
代码:

#include<bits/stdc++.h>
using namespace std;
int Map[1005][1005],dis[1005],book[1005],link[1005];//dis表示距离,book,做标记
const int inf=9999999999;//赋值为无穷
int n,m;
void Dijstra(int st,int flag)//单源点位置
{
memset(book,0,sizeof(book));
for(int i=0; i<=n; i++)
{
dis[i]=inf;
}
dis[st]=0;//出发点为零
//int minx=inf,pos;
for(int i=0; i<=n; i++)
{
int minx=inf,pos;
for(int j=1; j<=n; j++)
{
if(dis[j]<minx&&!book[j])//点没有被使用
{
minx=dis[j];
pos=j;
}
}
book[pos]=1;//该点被使用后,不可在被选为中间点
for(int j=1; j<=n; j++)
{
if(dis[j]>dis[pos]+Map[pos][j])
{
dis[j]=dis[pos]+Map[pos][j];
if(flag)
link[j]=pos;
}
}

}

}
int main()
{
int st,x,y,val;
while(~scanf("%d %d",&n,&m))
{
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
Map[i][j]=inf;

Map[i][i]=0;
}

while(m--)
{
scanf("%d %d %d",&x,&y,&val);
if(val<Map[x][y])
Map[x][y]=Map[y][x]=val;
}

memset(link,0,sizeof(link));
Dijstra(1,1);//单源1--->任意点记录路径
//cout<<dis[3]<<endl;
int ans=dis[n];
for(int i=n; i!=1; i=link[i])
{
int tem=Map[i][link[i]];//存下一路径
Map[link[i]][i]=Map[i][link[i]]=inf;//毁掉这条路
Dijstra(1,0);
ans=max(ans,dis[n]);
Map[link[i]][i]=Map[i][link[i]]=tem;//恢复这条路

}
cout<<ans<<endl;

}
}


举报

相关推荐

0 条评论