很不能理解
查看原帖
很不能理解
748700
IkunTeddy楼主2023/8/29 09:35

测试点本地跑都是对的,但一交就全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;
}


2023/8/29 09:35
加载中...