社区讨论
萌新求助,提交TLE,本机
P3573[POI 2014] RAJ-Rally参与者 8已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mi6ylns0
- 此快照首次捕获于
- 2025/11/20 12:56 4 个月前
- 此快照最后确认于
- 2025/11/20 15:34 4 个月前
这题是不是只有我一个人T了
有哪位大佬愿意来帮我看看哪里打丑了qaq
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int _=5e5+5;
const int M=2e6;
inline int read()
{
char ch='!';int z=1,num=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')z=-1,ch=getchar();
while(ch<='9'&&ch>='0')num=(num<<3)+(num<<1)+ch-'0',ch=getchar();
return z*num;
}
int n,m,S,du[_];
struct ed{int to,next,w;}e[M];
int cnt,head[_];
void link(int u,int v,int w){e[++cnt]=(ed){v,head[u],w};head[u]=cnt;}
struct ha{int u,v;}ln[M];
int d[_],f[_],g[_];
//f 结尾 g 开头
queue<int>Q;
bool vis[_];
void spfa(int S)
{
memset(d,-63,sizeof(d));
Q.push(S);d[S]=0;vis[S]=1;
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(d[v]<d[u]+e[i].w)
{
d[v]=d[u]+e[i].w;
if(!vis[v])vis[v]=1,Q.push(v);
}
}
vis[u]=0;
}
}
struct Ha{int x,id;
bool operator < (const Ha &A)const
{
return x<A.x;
}
};
int id[_],di[_];
priority_queue<Ha>q;
int main()
{
S=0;n=read(),m=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read();
ln[i]=(ha){u,v};du[v]++;
}
for(int i=1;i<=m;++i)link(ln[i].v,ln[i].u,1);
for(int i=1;i<=n;++i)link(S,i,0);
spfa(S);for(int i=1;i<=n;++i)g[i]=d[i];
cnt=0;memset(head,0,sizeof(head));
for(int i=1;i<=m;++i)link(ln[i].u,ln[i].v,1);
for(int i=1;i<=n;++i)link(S,i,0),du[i]++;
spfa(S);for(int i=1;i<=n;++i)f[i]=d[i];
for(int i=1;i<=n;++i)link(i,n+1,0),du[n+1]++;
cnt=0;Q.push(0);
while(!Q.empty())
{
int u=Q.front();Q.pop();
id[u]=++cnt;di[cnt]=u;
for(int i=head[u];i;i=e[i].next)
if(!--du[e[i].to])Q.push(e[i].to);
}
for(int i=head[S];i;i=e[i].next)
q.push((Ha){g[e[i].to],id[e[i].to]});
int ans1,ans2=-1;
for(int i=1;i<=n;++i)
{
while(!q.empty()&&q.top().id<=i+1)q.pop();
if(!q.empty())
{
Ha u=q.top();
if(ans2==-1||u.x<ans2)ans1=di[i+1],ans2=u.x;
}
int u=di[i+1];
for(int j=head[u];j;j=e[j].next)
q.push((Ha){g[e[j].to]+f[u]+e[j].w,id[e[j].to]});
}
printf("%d %d\n",ans1,ans2);
return 0;
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...