dijkstra 复杂度n方,加上优先队列复杂度nlogn
dijkstra+heap 换模板改模板,希望这个模板能用吧。。。
两个结构体一个纪录点一个纪录边
#include <iostream>
#include<stdio.h>
#include<cstdlib>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
#define mod 1000000007
#define ll long long
#define FOR(i,j,k) for(int i=j;i<=k;i++)
const int inf=0x3f3f3f3f;
const int N=30005;
int n,m;
struct node
{
int id,val;
node(int _id=0,int _val=0):id(_id),val(_val) {}
bool operator < (const node & a) const
{
return val>a.val;
}
};
struct Edge
{
int v,next,w;
};
Edge edge[150005];
int head[N],k;
int vis[N];
int d[N];
void dijkstra(int start)
{
priority_queue <node> que;
node temp;
int u,v,w;
for(int i=1;i<=n;i++)
{
d[i]=inf;
vis[i]=0;
}
que.push(node(start,0));
d[start]=0;
while(!que.empty())
{
temp=que.top();
que.pop();
u=temp.id;
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
w=edge[i].w;
if(d[v]>d[u]+w&&!vis[v])
{
d[v]=d[u]+w;
que.push(node(v,d[v]));
}
}
}
}
void init()
{
for(int i=1;i<=n;++i)
head[i]=-1;
k=0;
}
void addedge(int u,int v,int w)
{
edge[k].v=v;
edge[k].w=w;
edge[k].next=head[u];
head[u]=k++;
}
int main()
{
scanf("%d %d",&n,&m);
init();
int a,b,c;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
dijkstra(1);
printf("%d\n",d[n]);
return 0;
}