路 [ 最短路问题Dijkstra+枚举 ]
路 的题目链接
直接放代码了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <queue>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 255; //注意数组的范围
int e[maxn][maxn]; //每条路经的长度
int dis[maxn],vis[maxn];
int n,m;
void init() //录入的函数
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
e[i][j] = INF; //开始先标记为无穷大
}
}
int a,b,c;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d",&a,&b,&c);
e[a][b] = c;
e[b][a] = c;
}
}
void Dijkstra()
{
for(int i = 1; i <= n; i++)//算出1到各个点的距离
{
dis[i] = e[1][i];
vis[i] = 0;
}
vis[1] = 1;
for(int i = 1; i <= n; i++)
{
int mmin = INF;
int u;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && dis[j] < mmin)
{
mmin = dis[j];
u = j;
}
}
vis[u] = 1;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && dis[j] > e[u][j] + dis[u])
{
dis[j] = e[u][j] + dis[u];
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
init();
Dijkstra();
int minpath=dis[n];
int maxpath=-0x3f3f3f3f;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) //枚举每条路都翻倍 找出最长的那段路
{
if(i!=j)
{
int w=e[i][j];
e[i][j]=2*w;
e[j][i]=2*w;
Dijkstra();
maxpath=max(maxpath,dis[n]);
e[i][j]=w;
e[j][i]=w;
}
}
}
printf("%d\n",maxpath-minpath);
return 0;
}