题目大意
给一个无向图,首先输入两个整数T和N,T 表示边的数目,N表示顶点数目。接下来输入 T 组数据,格式为u v w,求出第一个顶点到最后一个定点的最短路径。
题解
题目要求的是单源最短路,并且权值没有负数,应用Drikstra算法即可求得。
需要一个数组dist用来保存第一个顶点F到所有顶点当前的最短路径长度,一个标记数组visited用来标记是否已处理过。每次从未处理过的顶点集合中B选择一个与第一个顶点距离最短的点P加入到集合中A中(用标记数组即可识别哪些点处理过,哪些未处理过),然后更新所有与P连接的点J到F的距离,若distance(F,P)+distance(P,J)< distance(F,J),则更新。直到求出所有点到F的最小距离。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Maxn = 1005;
const int Inf = 1 << 30;
int fileds[Maxn][Maxn];
int dist[Maxn];
bool visited[Maxn];
int n;
void Dirkstra(int s)
{
memset(visited,false,sizeof(visited));
int i,j,k;
for(i = 1;i <= n;++i)
dist[i] = fileds[s][i];
for(i = 1;i<= n;++i)
{
int Min = Inf;
int k;
for(j = 1;j <= n;++j)
{
if(dist[j] < Min && !visited[j])
{
Min = dist[j];
k = j;
}
}
visited[k] = true;
for(j = 1;j <= n;++j) //更新
{
if((!visited[j]) && (dist[k]+fileds[k][j] < dist[j]))
dist[j] = dist[k]+fileds[k][j];
}
}
}
int main()
{
int t;
scanf("%d%d",&t,&n);
for(int i = 1;i <= n;++i)
{
for(int j = 1; j <= n;++j)
{
fileds[i][j] = Inf;
}
}
for(int i = 1;i <= t;++i)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w < fileds[u][v])
{
fileds[u][v] = w;
fileds[v][u] = w;
}
}
Dirkstra(1);
printf("%d\n",dist[n]);
}