社区讨论

TLE求调

AT_abc335_e[ABC335E] Non-Decreasing Colorful Path参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lr78on8s
此快照首次捕获于
2024/01/10 11:46
2 年前
此快照最后确认于
2024/01/10 17:29
2 年前
查看原帖
用的是并查集把权值相同点缩成一个点,然后重新建图跑dij,但是不知道为什么会TLE13个点。
代码:
CPP
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define mk make_pair
using namespace std;
const int N=2e5+5;
int n,m;
int f[N],a[N];
int id[N],idx,S,T;
int dis[N];
bool vis[N];
priority_queue<pii>q;
inline int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}
int cnt,head[N],cntg,headg[N];
struct edge{
	int v,nxt;
}e[N<<1],g[N<<1];
inline void adde(int u,int v){
	e[++cnt]={v,head[u]};
	head[u]=cnt;
}
inline void addg(int u,int v){
	g[++cntg]={v,headg[u]};
	headg[u]=cntg;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],f[i]=i;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		if(a[u]==a[v]){
			u=find(u),v=find(v);
			if(u!=v) f[u]=v;
		}
		else if(a[u]>a[v]) adde(v,u);
		else adde(u,v);
	}
	for(int i=1;i<=n;i++) if(f[i]==i) id[i]=++idx;
	for(int i=1;i<=n;i++) id[i]=id[find(i)];
	S=id[1],T=id[n];
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=e[j].nxt){
			int v=e[j].v;
			addg(id[i],id[v]);
		}
	}
	q.push(mk(1,S));
	dis[S]=1;
	while(q.size()){
		int u=q.top().se;
		q.pop();
		vis[u]=0;
		for(int i=headg[u];i;i=g[i].nxt){
			int v=g[i].v;
			if(dis[v]<dis[u]+1){
				dis[v]=dis[u]+1;
				if(!vis[v]) vis[v]=1,q.push(mk(dis[v],v));
			}
		}
	}
	cout<<dis[T];
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...