#include <iostream>
#include <queue>
using namespace std;
#define MAX_N 30005
#define MAX_E 150005
#define INF 1<<30
static int N,M;
static struct Edge
{
int from;
int to;
int cost;
int next;
};
static struct PP
{
int index;
int dis;
PP(int _c,int _d):index(_c),dis(_d)
{
}
bool operator<(const PP&rs)const
{
return dis>rs.dis;
}
};
static Edge edges[MAX_E];
static int head[MAX_N];
static int cnt;
static int d[MAX_N];//单源最短路径
static void addEdge(int from,int to,int cost)
{
edges[cnt].from = from;
edges[cnt].to = to;
edges[cnt].cost = cost;
edges[cnt].next = head[from];
head[from] = cnt;
cnt++;
}
static void dijkstra(int s)
{
for (int i=1;i<=N;++i)
d[i] = INF;
priority_queue<PP>que;
que.push(PP(s,0));
d[s] = 0;
while(!que.empty())
{
PP tmp = que.top();
que.pop();
int u,v,cost;
u = tmp.index;
if (d[u]<tmp.dis)
continue;
for (int i=head[u];i!=-1;i=edges[i].next)
{
v = edges[i].to;
cost = edges[i].cost;
if (d[v]>d[u]+cost&&d[u]!=INF)
{
d[v] = d[u] + cost;
que.push(PP(v,d[v]));
}
}
}
}
int main()
{
memset(head,-1,sizeof head);
scanf("%d %d",&N,&M);
int from,to,cost;
cnt = 0;
for (int i=0;i<M;++i)
{
scanf("%d %d %d",&from,&to,&cost);
addEdge(from,to,cost);
}
dijkstra(1);
printf("%d\n",d[N]);
return 0;
}
POJ3159差分约束最短路径问题
最新推荐文章于 2017-12-19 14:16:41 发布