《关于我没过样例100pts这件事》
查看原帖
《关于我没过样例100pts这件事》
507534
YBaggio楼主2022/10/23 21:44

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
int n,m,cnt,rd[maxn],Rd[maxn],top[maxn],tot,ans,dot;
int head[maxn],Cnt,Head[maxn],dist[maxn],diss[maxn];
struct E{
    int to,next;
}edge[maxn],Edge[maxn];
void add(int u,int v){
    edge[++cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
}
void Add(int u,int v){
    Edge[++Cnt].to=v;Edge[Cnt].next=Head[u];Head[u]=Cnt;
}
struct Heap{
    priority_queue<int>q;
    priority_queue<int>d;
    void push(int x){
        q.push(x);
    }
    void del(int x){
        d.push(x);
    }
    int top(){
        while(!q.empty()&&!d.empty()&&q.top()==d.top())q.pop(),d.pop();
        return q.top();
    }
}heap;
int main(){
    ios::sync_with_stdio(false);
    std::cin.tie(0);std::cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;cin>>u>>v;
        add(u,v);Add(v,u);
        rd[v]++;Rd[u]++;
    }
    queue<int>q;
    for(int i=1;i<=n;i++)if(!rd[i])q.push(i);
    while(!q.empty()){
        int x=q.front();q.pop();
        top[++tot]=x;
        for(int i=head[x];i;i=edge[i].next){
            int y=edge[i].to;
            rd[y]--;
            if(!rd[y])q.push(y);
            dist[y]=max(dist[y],dist[x]+1);
        }
    }
    for(int i=1;i<=n;i++)if(!Rd[i])q.push(i);
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=Head[x];i;i=Edge[i].next){
            int y=Edge[i].to;
            Rd[y]--;
            if(!Rd[y])q.push(y);
            diss[y]=max(diss[y],diss[x]+1);
        }
    }
    for(int i=1;i<=n;i++)heap.push(diss[i]);
    ans=heap.top();
    for(int i=1;i<=n;i++){
        int x=top[i];
        heap.del(diss[x]);
        for(int j=Head[x];j;j=Edge[j].next){
            int y=Edge[j].to;
            heap.del(dist[y]+diss[x]+1);  
        }  
        if(heap.top()<=ans){
            ans=heap.top();dot=x;
        }for(int j=head[x];j;j=edge[j].next{
            int y=edge[j].to;
            heap.push(dist[x]+diss[y]+1);
        }heap.push(dist[x]);
    }
    cout<<dot<<' '<<ans;
    return 0;
}

本地运行是没有过样例的,但是提交后就AC了...

2022/10/23 21:44
加载中...