谁能帮忙优化一下?

P1983 [NOIP2013 普及组] 车站分级

qd_zhanghuali @ 2020-01-19 16:30:20

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,x,y,r[1001],fin,q,ans,str,end,k[1001],head=1,tail=1;
bool f[1001],e[1001][1001];
inline int getint(){
    char ch;
    int ret;
    while(ch=getchar(),ch<'0'||ch>'9');
    ret=ch-'0';
    while(ch=getchar(),ch>='0'&&ch<='9'){
        ret=(ret<<3)+(ret<<1)+ch-'0';
    }
    return ret;
}
void qk(){
    for(int i=str;i<=end;i++)f[i]=0;
}
int main(){
    n=getint();
    m=getint();
    for(int i=1;i<=m;i++){
        x=getint();
        for(int u=1;u<=x;u++){
            y=getint();
            if(u==1)str=y;
            if(u==x)end=y;
            f[y]=1;
        }
        for(int u=str;u<=end;u++){
            if(f[u]==0){
                for(int p=str;p<=end;p++){
                    if(f[p]==1&&e[u][p]==0){
                        r[p]++;
                        e[u][p]=1;
                    }
                }
            }
        }
        if(i!=m)qk();
    }
    while(fin<n){
        for(int i=1;i<=n;i++){
            if(r[i]==0){
                fin++;
                r[i]--;
                k[tail]=i;
                tail++;
            }
        }
        for(;head<tail;head++){
            for(int u=1;u<=n;u++){
                if(e[k[head]][u]==1){
                    e[k[head]][u]=0;
                    r[u]--;
                }
            }
        }
        ans++;
    }
    cout<<ans;
}

by DepletedPrism @ 2020-01-19 23:48:56

@qd_zhanghuali 您这思路没有, 代码注释没有, 打算让我们先阅读理解再优化吗 (


by qd_zhanghuali @ 2020-01-20 14:06:03

一个点TIE了,但也能算出正确的结果

就是先让每一组数据始发站和终点站之间没经过的站指向经过了的站,计算完入度之后再拓扑排序,每一次将入度为0的点都删去,计算总共删了几轮,就是车站要分成几级


|