题意很容易理解,是经典的 Dijkstra算法,今天用堆优化的方法写了一遍,这里有我之前写的用数组存图的普通Dijkstra算法。
堆优化用vector存图,能够解决二维数组不能开的太大的问题,pii first存的是距离,second存的是id。优先队列能够更快找到
最短路路径。
ac代码如下(写的有些复杂):
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const ll maxn=1e6;
const ll inf=0x3f3f3f3f;
int n,m;
vector<pii> v[maxn];
ll dis[maxn];
bool vis[maxn];
void dj()
{
dis[1]=0;
vis[1]=1;
pii x,y,z;
x.first=0;
x.second=1;
priority_queue<pii,vector<pii>,greater<pii> >q;//给pii排序时先排fist 其次second
q.push(x);
while(!q.empty())
{
x=q.top();
q.pop();
// dis[x.second]=x.first;//注意,这行代码不能有 , 手动模拟代码下第三个 样例易理解
vis[x.second]=1;
for(int i=0;i<v[x.second].size();i++)
{
y=v[x.second][i];
if(vis[y.second]==0&&x.first+y.first<dis[y.second])
{
dis[y.second]=x.first+y.first;
z.first=dis[y.second];
z.second=y.second;
q.push(z);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{ int x,y,z;
pii s;
if(n==0&&m==0)
break;
for(int i=0;i<=n;i++)
{
dis[i]=inf;
vis[i]=0;
v[i].clear();
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
s.first=z,s.second=y;
v[x].push_back(s);
s.second=x;
v[y].push_back(s);
}
dj();
printf("%lld\n",dis[n]);
}
return 0;
}
/*
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
4 4
1 2 3
1 4 2
1 3 5
3 4 2
*/