构造虚点,nb

P1983 [NOIP2013 普及组] 车站分级

KleinZh @ 2017-09-25 00:34:00

大佬的思维ORZ


by Erina @ 2017-10-09 12:47:17

#include<iostream>
#include<cstring>
using namespace std;
const int Size=1003;
int level[Size],road[Size];
bool d[Size][Size];        //d[i][j]:    第i个车站比第j个小 
int n,m;
void dfs(int p) {
    for(int i=1; i<=n; i++) {
        if(d[p][i]) {
            if(!level[i])    dfs(i);
            level[p]=max(level[i],level[p]);    //取i和p的最大值 
        }
    }
    level[p]++;
}
int main() {
    std::ios::sync_with_stdio(false);
    int len,now,maxlevel=0;
    cin>>n>>m;
    for(register int i=1; i<=m; i++) {
        memset(road,0,sizeof(road));
        cin>>len;
        for(register int j=1; j<=len; j++)
            cin>>road[j];
        now=2;
        for(register int j=road[1]+1; j<road[len]; j++) {
            if(j==road[now]) {
                now++;
                continue;
            }
            for(register int k=1; k<=len; k++) {
                d[j][road[k]]=true;
            }
        }
    }
    for(register int i=1; i<=n; i++) {
        if(!level[i]) {
            dfs(i);
        }
    }
    for(register int i=1; i<=n; i++)
        if(level[i]>maxlevel)
            maxlevel=level[i];
    cout<<maxlevel;
    return 0;
}
用dfs居然过了!

|