[Luogu] P1038 [Grupo de mejora NOIP2003] Red neuronal (clasificación topológica)

Descripción del Título

Inserte la descripción de la imagen aquí

Introducción al ordenamiento topológico

Ideas para resolver problemas

Código AC

#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
    using namespace std;
    const int N=150;
    int C[N],U[N],In[N],Out[N],input[N];
    int n,p;
    struct edge{
    
    
    int v,w;
    edge(int _v,int _w) : v(_v) , w(_w){
    
    }
    };
    vector<edge>E[N];
    queue<int>q;
    bool topsort(){
    
    
    int cot=0;
    for(int i=1;i<=n;i++)
    {
    
    
    if(In[i]==0) {
    
    
    q.push(i);
    input[i]=1;
    }
    if(Out[i]==0) cot++;
    }
    while(!q.empty()){
    
    
    int u=q.front();
    q.pop();
    if(input[u]==0) C[u]-=U[u];
    if(C[u]==0&&Out[u]==0) cot--;
    for(int i=0;i<E[u].size();i++){
    
    
       int v=E[u][i].v;
       int w=E[u][i].w;
       In[v]--;
       if(In[v]==0) q.push(v);
       if(C[u]>0) C[v]+=w*C[u];
        }
        }
     return cot==0;
    }
    int main(){
    
    
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++)
    scanf("%d%d",&C[i],&U[i]);
    for(int i=1;i<=p;i++) {
    
    
    int u,v,w;
    scanf("%d%d%d",&u,&v,&w);
    E[u].push_back(edge(v,w));
    Out[u]++;
    In[v]++;
    }
    if(topsort()) printf("NULL");
    else{
    
    
    for(int i=1;i<=n;i++)
    if(Out[i]==0&&C[i]>0) printf("%d %d\n",i,C[i]);
    }
    return 0;
    }

Blog anterior: [Niuke.com] El número k de la secuencia (potencia rápida)

Supongo que te gusta

Origin blog.csdn.net/IAMLSL/article/details/114613500
Recomendado
Clasificación