测试点本地跑都是对的,但一交就全WA了。
求助!
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstring>
#include <algorithm>
#define int long long
#define P pair<int,int>
using namespace std;
const int maxn=2e6+10;
struct Edge{
int v,w,next;
}edge[maxn];
int head[maxn],tot;
void add_edge(int u,int v,int w){
edge[++tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot;
}
int dfn[maxn],low[maxn],vis[maxn],scc[maxn],SCC;
stack<int>stk;
void dfs_scc(int u){
dfn[u]=low[u]=++dfn[0];
stk.push(u);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(!dfn[v]){
dfs_scc(v);
low[u]=min(low[u],low[v]);
}else if(vis[v]==0){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
SCC++;
while(!stk.empty()){
int x=stk.top();
stk.pop();
vis[x]=1;
scc[x]=SCC;
if(x==u)break;
}
}
}
struct EDGE{
int v,w;
};
vector<EDGE>vt[maxn];
int dis[maxn];
int n,m;
priority_queue<P,vector<P>,greater<P> > que;
void dij(int s,int t){
memset(vis,0,sizeof(vis));
for(int i=1;i<=SCC;i++){
dis[i]=1e18;
}
dis[s]=0;
que.push({0,s});
while(!que.empty()){
int u=que.top().second;
que.pop();
if(vis[u])continue;
vis[u]=1;
int l=vt[u].size();
for(int i=0;i<l;i++){
int v=vt[u][i].v;
int w=vt[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
que.push({dis[v],v});
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
}
for(int i=1;i<=n;i++){
if(dfn[i])continue;
dfs_scc(i);
}
for(int u=1;u<=n;u++){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
int w=edge[i].w;
if(scc[u]==scc[v])continue;
vt[scc[u]].push_back({scc[v],w});
}
}
int s=scc[1];
int t=scc[n];
dij(s,t);
cout<<dis[t];
return 0;
}