#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#define MAXN 100010
#define INF 0x3f3f3f3f
using namespace std;
int length[1005][1005];//存两点间边的长度
struct Pair{
int first,second;
bool friend operator < (Pair a,Pair b)//优先队列中小的优先级高
{
return a.second>b.second;
}
}pr,ne;
int dis[MAXN];//存点到起点的距离
vector<int > ege[MAXN];//存点
void dijkstra()
{
memset(dis,INF,sizeof(dis));
bool vis[MAXN];//判断是否找过某个点
memset(vis,false,sizeof(vis));
pr.first=1;
pr.second=0;
priority_queue<Pair> Q;
Q.push(pr);
while(!Q.empty())
{
pr=Q.top();
Q.pop();
if(vis[pr.first])
{
continue;
}
vis[pr.first]=true;
for(int i=0;i<ege[pr.first].size();i++)
{
ne.first=ege[pr.first][i];
ne.second=pr.second+length[pr.first][ne.first];
if(ne.second<dis[ne.first])
{
dis[ne.first]=ne.second;
Q.push(ne);
}
}
}
}
int main()
{
int T,N;
while(~scanf("%d %d",&T,&N))
{
memset(length,-1,sizeof(length));
for(int i=0;i<T;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
ege[x].push_back(y);
ege[y].push_back(x);
if(length[x][y]==-1)
length[x][y]=length[y][x]=z;
else
length[x][y]=length[y][x]=min(z,length[x][y]);
}
dijkstra();
printf ("%d\n",dis[N]);
}
return 0;
}
最短路之dijkstra
最新推荐文章于 2024-05-07 20:52:58 发布