社区讨论

萌新求助,提交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
感谢
CPP
// 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 条回复,欢迎继续交流。

正在加载回复...