求助,正解方法,拓扑+dij,调了几天只有57分,求大佬帮忙调试
查看原帖
求助,正解方法,拓扑+dij,调了几天只有57分,求大佬帮忙调试
310773
PCCP楼主2023/1/21 17:29

RT,4个WA,3个TLE,蒟蒻可以提供关注作为回报。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int N=50001;
int t,r,p,s,cnt,indeg[N],fa[N],dist[N];
int he[N<<1],ne[N<<1],to[N<<1],tot1,l[N<<1];
bool st[N];
queue <int> q;
vector <int> sdcc[N];
void addedge1(int x,int y,int z){
    to[++tot1]=y;
    ne[tot1]=he[x];
    he[x]=tot1;
    l[tot1]=z;
}
void dfs(int now){
    fa[now]=cnt;
    sdcc[cnt].push_back(now);
    for(int i=he[now];i;i=ne[i]){
        int v=to[i];
        if(fa[v]){
            continue;
        }
        dfs(v);
    }
}
priority_queue <PII,vector<PII>,greater<PII> > pp;
int main(){
	freopen("P3008_2.in","r",stdin);
	freopen("P3008.out","w",stdout);
    vector <int>::iterator item;
    scanf("%d%d%d%d",&t,&r,&p,&s);
    int u,v,w;
    for(int i=1;i<=r;i++){
        scanf("%d%d%d",&u,&v,&w);
        addedge1(u,v,w);
        addedge1(v,u,w);
    }
    for(int i=1;i<=t;i++){
        if(!fa[i]){
            fa[i]=++cnt;
            dfs(i);
        }
    }
    for(int i=1;i<=p;i++){
        scanf("%d%d%d",&u,&v,&w);
        ++indeg[fa[v]];
        addedge1(u,v,w);
    }
    q.push(fa[s]);  
    for(int i=1;i<=cnt;i++){
        if(indeg[i]==0&&fa[s]!=i){
            q.push(i);
        }
    }
    memset(dist,0x3f,sizeof dist);
    memset(st,false,sizeof st);
    dist[s]=0;
    while(q.size()){
        int m=q.front();
        q.pop();
        for(item=sdcc[m].begin();item!=sdcc[m].end();item++){
            pp.push(PII(dist[*item],*item));
        }
        while(pp.size()){
            PII e=pp.top();
            pp.pop();
            if(st[e.second]==true){
                continue;
            }
            st[e.second]=true;
            for(int i=he[e.second];i;i=ne[i]){
                v=to[i];
                if(e.first+l[i]<dist[v]){                                        
                    dist[v]=e.first+l[i];
                    if(fa[e.second]==fa[v]){
                        pp.push(PII(dist[v],v));
                    }
                }
                if(fa[e.second]!=fa[v]){
                    --indeg[fa[v]];
                    if(indeg[fa[v]]==0){
                        q.push(fa[v]);
                    }
                }
            }
        }
    }
    for(int i=1;i<=t;i++){
        if(dist[i]>=1e9){
            printf("NO PATH\n");
        }
        else{
            printf("%d\n",dist[i]);
        }
    }
}
2023/1/21 17:29
加载中...