分层图 TLE+MLE 70pts
查看原帖
分层图 TLE+MLE 70pts
289296
zymooll楼主2022/11/19 11:41

#2 #6 #10

虽说写的是 MLE,但是本地测也是 TLE

如果分层图过不了就直接说吧哈哈,反正也是乱写的

代码如下:

// Problem: P1073 [NOIP2009 提高组] 最优贸易
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1073
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// Author:zymooll

#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
//#define int long long
using namespace std;
int read(){
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';
		c=getchar();
	}
	return s*w;
}
void print(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>=10)print(x/10);
	putchar(x%10+'0');
	return;
}
int n,m;
struct Edge{
	int v,w,next;
}edge[3000010];//i+0*n->l1 i+1*n->l2 i+2*n->l3
int head[100010],dis[300010],cut;
priority_queue<pair<int,int> >q;
void add_edge(int u,int v,int w){
	edge[++cut].v=v;
	edge[cut].w=w;
	edge[cut].next=head[u];
	head[u]=cut;
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		int ls=read();
		add_edge(i,i+n,100-ls);
		add_edge(i+n,i+2*n,100+ls);
		//用dijk非得是正的边权
	}
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),type=read();
		add_edge(u,v,0);
		add_edge(u+n,v+n,0);
		add_edge(u+2*n,v+2*n,0);
		if(type==2){
			add_edge(v,u,0);
			add_edge(v+n,u+n,0);
			add_edge(v+2*n,u+2*n,0);
		}
	}
	for(int i=2;i<=3*n;i++)dis[i]=-1;
	dis[1]=0;
	q.push(make_pair(0,1));
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].v,w=edge[i].w;
			//cerr<<u<<" "<<v<<" "<<w<<"\n";
			if(dis[v]<dis[u]+w){
				dis[v]=dis[u]+w;
				q.push(make_pair(dis[v],v));
			}
		}
	}
	print(max(dis[n],dis[n*3])-200);
	return 0;
}
2022/11/19 11:41
加载中...