93分求调 QwQ
挂了第 3 个测试点,就很离谱 QAQ
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
inline int read()
{
int num=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {num=(num<<1)+(num<<3)+ch-'0';ch=getchar();}
return num*w;
}
int n,m,u,v,w,tmp;
int head[1000001],tot;
int h[1000001],lol;
struct node
{
int from;
int to;
int nex;
int w;
}g[1000001],mapp[1000001];
int dfn[1000001],cnt;
int low[1000001];
int stac[1000001],top;
bool vis[1000001];
bool vi[1000001];
int fa[1000001];
int dis[1000001];
inline void add_1(int xx,int yy,int w)
{
g[++tot]=(node){xx,yy,head[xx],w};
head[xx]=tot;
return;
}
inline void add_2(int xx,int yy,int w)
{
mapp[++lol]=(node){xx,yy,h[xx],w};
h[xx]=lol;
return;
}
inline void tanjor(int k)
{
dfn[k]=low[k]=++cnt;
vis[k]=1;
stac[++top]=k;
for(int i=head[k];i;i=g[i].nex)
{
int to=g[i].to;
if(!dfn[to]) tanjor(to),low[k]=min(low[k],low[to]);
else if(vis[to]) low[k]=min(low[k],dfn[to]);
}
if(low[k]==dfn[k])
{
fa[k]=++tmp;
while(stac[top]!=k)
{
vis[stac[top]]=0;
fa[stac[top]]=tmp;
top--;
}
top--;
}
return;
}
priority_queue<pair<int,int> > q;
inline void dijkstra()
{
memset(dis,0x3f3f3f,sizeof(dis));
dis[fa[1]]=0;
q.push(make_pair(0,fa[1]));
while(q.size())
{
u=q.top().second;
q.pop();
if(vi[u]) continue;
vi[u]=1;
for(int i=h[u];i;i=mapp[i].nex)
{
v=mapp[i].to;
if(dis[u]+mapp[i].w<dis[v])
{
dis[v]=dis[u]+mapp[i].w;
q.push(make_pair(-dis[v],v));
}
}
}
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read(),m=read();
for(register int i=1;i<=m;i++) u=read(),v=read(),w=read(),add_1(u,v,w);
for(register int i=1;i<=n;i++) if(!dfn[i]) tanjor(i);
for(int i=1;i<=m;i++)
{
if(fa[g[i].from]!=fa[g[i].to])
{
add_2(fa[g[i].from],fa[g[i].to],g[i].w);
}
}
dijkstra();
printf("%d\n",dis[1]);
//fclose(stdin);
//fclose(stdout);
return 0;
}