Dijkstra HDU 1874

来源:互联网 发布:实名淘宝小号单个购买 编辑:程序博客网 时间:2024/05/20 09:21
#include<vector>
#include<queue>
using namespace std;
/*
Dijkstra的算法思想:
在所有没有访问过的结点中选出dis(s,x)值最小的x
对从x出发的所有边(x,y),更新
dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
*/
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int inf = 1 << 27;
struct node{
int x, d;
node(){}
node(int a, int b){ x = a; d = b; }
};
bool operator <(node a, node b)
{
if (a.d == b.d) return a.x<b.x;
else return a.d > b.d;
}
vector<node>eg[1005];
int dis[1005], n,m;
void Dijkstra(int s)
{
for (int i = 0; i <= n; i++)dis[i] = inf;
dis[s] = 0;
priority_queue<node>q;
q.push(node(s, dis[s]));
while (!q.empty())
{
node x = q.top();
q.pop();
for (int i = 0; i < eg[x.x].size(); i++)
{
node y = eg[x.x][i];
if (dis[y.x]>x.d + y.d)
{
dis[y.x] = x.d + y.d;
q.push(node(y.x, dis[y.x]));
}
}
}
}
/*void Dijkstra(int s)
{
int i;
for (i = 0; i <= n; i++) dis[i] = inf;
dis[s] = 0;
//用优先队列优化
priority_queue<node> q;
q.push(node(s, dis[s]));
while (!q.empty())
{
node x = q.top(); q.pop();
for (i = 0; i<eg[x.x].size(); i++)
{
node y = eg[x.x][i];
if (dis[y.x]>x.d + y.d)
{
dis[y.x] = x.d + y.d;
q.push(node(y.x, dis[y.x]));
}
}
}
}*/
int main()
{
int a, b, d;
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i <= n; i++) eg[i].clear();
while (m--)
{
scanf("%d%d%d", &a, &b, &d);
eg[a].push_back(node(b, d));
eg[b].push_back(node(a, d));
}
int s, e;
scanf("%d%d", &s, &e);
Dijkstra(s);
printf("%d\n", dis[e] == inf ? -1 : dis[e]);
}
return 0;
}
原创粉丝点击