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; }
时间: 2024-10-12 14:49:25