大根堆+Dij+链式前向星
过了样例,WA了#3、#4、#5、#6
#include<bits/stdc++.h>
#define rg register int
using namespace std;
const int MAXM=(2*1e5)+5,MAXN=(1e5)+5,INF=-(1<<30);
struct node
{
int id,dis;
bool operator < (const node& CSP)const
{
return dis<CSP.dis;
}
};
priority_queue<node>Que;
int head[MAXM],nxt[MAXM],to[MAXM],wei[MAXM],cnt,n,m,s=1,d[MAXN];
bool pd[MAXN];
void add(int From,int To,int Wei)
{
++cnt;
to[cnt]=To;
wei[cnt]=Wei;
nxt[cnt]=head[From];
head[From]=cnt;
}
int main()
{
scanf("%d%d",&n,&m);
int u,v,w;
node tmp;
for(rg i=1;i<=m;++i)
scanf("%d%d%d",&u,&v,&w),add(u,v,w);
for(rg i=1;i<=n;++i) d[i]=INF;
d[s]=0,tmp.id=s,tmp.dis=0;
Que.push(tmp);
while(!Que.empty())
{
tmp=Que.top();Que.pop();
int x=tmp.id;
if(pd[x]) continue;
pd[x]=1;
for(rg i=head[x];i;i=nxt[i])
{
if(d[to[i]]<d[x]+wei[i])
{
d[to[i]]=d[x]+wei[i];
if(!pd[to[i]])
{
tmp.id=to[i];
tmp.dis=d[to[i]];
Que.push(tmp);
}
}
}
}
if(d[n]==INF)
printf("-1");
else
printf("%d",d[n]);
}