虽然没有怎么看懂,时间复杂度从n的平方到了mlogn,应该还可以继续优化,抛掉已经访问的点,我还没想明白。
#include<iostream>
using namespace std;
#include<queue>
#include<vector>
const int Ni = 10010;
const int INF = 1 << 27;
struct node
{
int x, d;
node(){}
node(int a, int b)
{
x = a;
d = b;
}
bool operator<(const node &a)const
{
if (d == a.d)
return x < a.x;
else
return d > a.d;
}
};
vector<node>eg[Ni];
int dis[Ni], n;
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, m;
while (cin >> n >> m&&n + m)
{
int s, e;
for (int i = 0; i <= n; i++)
eg[i].clear();
while (m--)
{
cin >> a >> b >> d;
eg[a].push_back(node(b, d));
eg[b].push_back(node(a, d));
}
dijkstra(1);
cout << dis[n] << endl;
}
return 0;
}