求调:44 WA 以及 MLE 的原因
查看原帖
求调:44 WA 以及 MLE 的原因
1020063
chenxi2009楼主2024/11/1 20:26

代勾调者意愿悬关。

代码:dij 求最短路后 mp1 保存 x1x1y1y1 的最短路,mp2 保存 x2x2y2y2 的最短路,然后分别在两个方向上都拓扑求解。过程中没有参考任何题解,最终导致了样例与翻遍了讨论区和题解区的 Hack 全部通过但是 MLE 以及全部输出 0 的 WA。

1.MLE 的原因;
2.调代码并指出问题。

#include<bits/stdc++.h>
using namespace std;
int n,m,u,v,w,s1,s2,t1,t2,mp[1501][1501],mp1[1501][1501],dis[1501],mp2[1501][1501],rd[1501],f[1501],ans;
bool vis[1501];
vector<int>pre[1501];
vector<pair<int,int>>e[1501];
queue<int>qv;
priority_queue<pair<int,int>>q;
inline void dij(int s){
	for(int i = 1;i <= n;i ++){
		pre[i].clear();
	}
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[s] = 0;
	q.push({0,s});
	while(q.size()){
		int u = q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u] = true;
		for(auto [v,w] : e[u]){
			if(dis[v] > dis[u] + w){
				dis[v] = dis[u] + w;
				pre[v].clear();
				pre[v].push_back(u);
				q.push({-dis[v],v});
			}
			else if(dis[v] == dis[u] + w){
				pre[v].push_back(u);
			}
		}
	}
	return;
}
int main(){
	scanf("%d%d%d%d%d%d",&n,&m,&s1,&t1,&s2,&t2);
	for(int i = 1;i <= m;i ++){
		scanf("%d%d%d",&u,&v,&w);
		mp[u][v] = mp[v][u] = w;
		e[u].push_back({v,w}),e[v].push_back({u,w});
	}
	dij(s1);
	qv.push(t1);
	while(qv.size()){
		int u = qv.front();
		qv.pop();
		for(auto v : pre[u]){
			qv.push(v);
			mp1[v][u] = mp[v][u];
		}
	}
	dij(s2);
	qv.push(t2);
	while(qv.size()){
		int u = qv.front();
		qv.pop();
		for(auto v : pre[u]){
			qv.push(v);
			mp2[v][u] = mp[v][u];
		}
	}
	for(int i = 1;i <= n;i ++){
		e[i].clear();
	}
	for(u = 1;u <= n;u ++){
		for(v = 1;v <= n;v ++){
			if(mp1[u][v] && mp2[u][v]){
				e[u].push_back({v,mp[u][v]});
				rd[v] ++;
			}
		}
	}
	for(int i = 1;i <= n;i ++){
		if(!rd[i]){
			qv.push(i);
		}
	}
	while(qv.size()){
		int u = qv.front();
		qv.pop();
		for(auto [v,w] : e[u]){
			f[v] = max(f[v],f[u] + w);
			rd[v] --;
			if(!rd[v]){
				qv.push(v);
			}
		}
	}
	for(int i = 1;i <= n;i ++){
		ans = max(ans,f[v]);
		f[i] = 0,rd[i] = 0;
		e[i].clear();
	}
	for(u = 1;u <= n;u ++){
		for(v = 1;v <= n;v ++){
			if(mp1[u][v] && mp2[v][u]){
				e[u].push_back({v,mp[u][v]});
				rd[v] ++;
			}
		}
	}
	for(int i = 1;i <= n;i ++){
		if(!rd[i]){
			qv.push(i);
		}
	}
	while(qv.size()){
		int u = qv.front();
		qv.pop();
		for(auto [v,w] : e[u]){
			f[v] = max(f[v],f[u] + w);
			rd[v] --;
			if(!rd[v]){
				qv.push(v);
			}
		}
	}
	for(int i = 1;i <= n;i ++){
		ans = max(ans,f[i]);
	}
	printf("%d",ans);
	return 0;
}
2024/11/1 20:26
加载中...