题目
思路
这道题就是个简单求最短路的问题,图中的点数不超过1000,朴素的迪杰斯特拉算法,O(n^2)的时间复杂度就能过,直接套模板,就是两点之间的路径可能不只一条,记录邻接矩阵时要选取最短的一条路径。
题解
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define typec int
using namespace std;
const int MAXN=1010;
const typec INF=0x3f3f3f3f;//防止后面溢出,这个不能太大
bool vis[MAXN];
int pre[MAXN];
int cost[MAXN][MAXN];
int lowcost[MAXN];
void Dijkstra(typec cost[MAXN][MAXN],typec lowcost[MAXN],int n,int beg){
for(int i=0;i<n;i++){
lowcost[i]=INF;vis[i]=false;pre[i]=-1;
}
lowcost[beg]=0;
for(int j=0;j<n;j++){
int k=-1;
int Min=INF;
for(int i=0;i<n;i++)
if(!vis[i]&&lowcost[i]<Min){
Min=lowcost[i];
k=i;
}
if(k==-1)break;
vis[k]=true;
for(int i=0;i<n;i++)
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){
lowcost[i]=lowcost[k]+cost[k][i];
pre[i]=k;
}
}
}
int main()
{
int t,n;
cin>>t>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cost[i][j]=INF;
}
}
for(int i=0;i<n;i++)
{
cost[i][i]=0;
}
for(int i=0;i<t;i++)
{
int a,b,chag;
cin>>a>>b>>chag;
if(cost[a-1][b-1]>chag)
{
cost[a-1][b-1]=chag;
cost[b-1][a-1]=chag;
}
}
Dijkstra(cost,lowcost,n,n-1);
cout<<lowcost[0];
return 0;
}