社区讨论
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 条回复,欢迎继续交流。
正在加载回复...