标签:
dijstra 顺带回顾下 http://ideone.com/H6g4MS
dijstra: n点 m边 起点s 终点t 平均每个点m/n条边
1 遍历n找到 未使用的 距离起点最近的点p O(n) 开始的时候p=s dist[p]=0
2 如果p为终点,输出dist[p]作为结果。 O(1)
3 用p更新与p距离最近的n个点 O(m/n)
4 标记p为已经使用的点 回到步骤1 O(1)
1~4最多循环O(n)次
开销O(nn)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
struct Node
{
int location;
int distance;
bool operator <(const Node &other)
{
return distance<other.distance;
}
}node;
int dist[100100];
int used[100100]={0};
int main() {
memset(dist,0x0f,sizeof(dist));
vector<pair<int ,int>> que_n[100100];
int n,m,s,t;
cin>>n>>m>>s>>t;
s--;
t--;
int t1,t2,t3;
for(int i=0;i<m;i++)
{
cin>>t1>>t2>>t3;
que_n[t1-1].push_back(make_pair(t2-1,t3));
que_n[t2-1].push_back(make_pair(t1-1,t3));
}
dist[s]=0;
int unused_p=s;
while(true)
{
if(unused_p==t)
{
cout<<dist[t]<<endl;
break;
}
used[unused_p]=1;
for(int i=0;i<que_n[unused_p].size();i++)
{
int ttt = que_n[unused_p][i].first;
int disss = que_n[unused_p][i].second;
dist[ttt]=min(dist[ttt], dist[unused_p]+disss);
}
int mindis=100000000;
for(int i=0;i<n;i++)
{
if(used[i]==0&&dist[i]<mindis)
{
mindis = dist[i];
unused_p = i;
}
}
}
// your code goes here
return 0;
}
#1081 : 最短路径·一 hihocoder dijstra http://ideone.com/H6g4MS
标签:
原文地址:http://www.cnblogs.com/ding1993/p/5398728.html