#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 10010, INF = 0xfffffff;
int t,n;
int vis[maxn];
int d[maxn];
struct edge{ //定义边:起点u、终点v、长度d
int u,v;
int d;
edge(int u,int v,int d)
{
this->u = u;
this->v = v;
this->d = d;
}
};
vector<edge> Edge;
vector<int> G[maxn];
struct node{ //定义以u为起点距离为d的集合
int u;
int d;
node(int d,int u)
{
this->d = d;
this->u = u;
}
bool operator < (const node& a) const {
return d > a.d;
}
};
void add(int u,int v,int d)
{
Edge.push_back(edge(u,v,d)); //存放所有边
G[u].push_back(Edge.size()-1); //以u为起点的边在Edge中的序号
}
void dijkstra(int s)
{
priority_queue<node> Q;
for(int i=0;i<=n;i++) d[i] = INF;
d[s] = 0;
mem(vis,0);
Q.push(node(0,s)); //长度为0,点s为起点
while(!Q.empty())
{
node x = Q.top();Q.pop();
int u = x.u;
if(vis[u]) continue;
vis[u] = 1;
for(int i=0;i<G[u].size();i++)
{
edge e = Edge[G[u][i]];
if(d[e.v] > d[u] + e.d)
{
d[e.v] = d[u] + e.d;
Q.push(node(d[e.v],e.v));
}
}
}
}
int main()
{
int x,y,len;
int cnt = 0;
while(cin>>t>>n)
{
for(int i=0;i<=n;i++) G[i].clear();
Edge.clear();
for(int i=1;i<=t;i++)
{
cin>>x>>y>>len;
add(x,y,len);
add(y,x,len);
}
dijkstra(1);
printf("%d\n",d[n]);
}
return 0;
}
POJ2387 迪杰斯特拉:
最新推荐文章于 2022-02-14 15:10:00 发布