救救我.py

image
你是没看题吗?

输入格式有问题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[1005], o[1005], in[1005], dp[1005], d[1005], vis[1005];
vector<ll> v[1005];
ll b[1005][1005];
int main(){
    ll n, m;
    cin >> n >> m;
    for(ll i=1;i<=m;i++){
        cin >> s[i];
        vis[s[i]]=1;
    }
    for(ll i=s[1];i<=s[m];i++){
        if(vis[i]) continue;
        for(ll j=1;j<=m;j++){
            if(!b[i][s[j]]){//如果没建边 (因为我们是需要从没到站的向到站的建边,题目说等级更高的一定进站,即是高级的指向低级的)
                in[s[j]]++;//低级的站台入度+1 
                // o[i]++;
                v[i].push_back(s[j]);//用vector建边
                // v[s[j]].push_back(i);
                // b[s[j]][i]=1;
                b[i][s[j]]=1;//标记已建边
            }
        }
     }
    queue<ll> q;
	for(ll i=1;i<=n;i++){
		if(in[i]==0){
            dp[i]=1;
			q.push(i);
		}
	}
    ll ans=0;
    
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll k:v[u]){	
            in[k]--;
            if(in[k]==0){ dp[k]=max(dp[u]+1,dp[k]);            ans=max(dp[k], ans);}
			if(in[k]==0) q.push(k);
		} // 不用vis数组!!!!
	}
    cout << ans;
}

明天调吧

我来了!!!你来了吗

@吴梓峤 ??

@吴梓峤

来了

ou,帮我看一看有啥问题

image
按我说吧,你的输入格式有问题,m行每行输入一个ln,表示这辆车到了几站,然后循环ln次,输入s数组,然后,把这个循环:
image
放到上一个循环里。

像这样:

for(int i=1;i<=m;i++){
    cin>>ln;
    menmset(vis,0,sizeof(vis));
    for(int j=1;j<=ln;j++)
        //输入s数组,标记到站的
    //建边操作
}

像这样??

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[1005], o[1005], in[1005], dp[1005], d[1005], vis[1005];
vector<ll> v[1005];
ll b[1005][1005];
int main(){
    ll n, m;
    cin >> n >> m;
    for(ll i=1;i<=m;i++){
        ll ln;
        cin>>ln;
        memset(vis,0,sizeof(vis));
        for(ll j=1;j<=ln;j++){
            cin >> s[i];
            vis[s[i]]=1;
        }
        if(vis[i]) continue;
        for(ll j=1;j<=m;j++){
            if(!b[i][s[j]]){//如果没建边 (因为我们是需要从没到站的向到站的建边,题目说等级更高的一定进站,即是高级的指向低级的)
                in[s[j]]++;//低级的站台入度+1 
                // o[i]++;
                v[i].push_back(s[j]);//用vector建边
                // v[s[j]].push_back(i);
                // b[s[j]][i]=1;
                b[i][s[j]]=1;//标记已建边
            }
        }
    }
    queue<ll> q;
	for(ll i=1;i<=n;i++){
		if(in[i]==0){
            dp[i]=1;
			q.push(i);
		}
	}
    ll ans=0;
    
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll k:v[u]){	
            in[k]--;
            if(in[k]==0){ dp[k]=max(dp[u]+1,dp[k]);            ans=max(dp[k], ans);}
			if(in[k]==0) q.push(k);
		} // 不用vis数组!!!!
	}
    cout << ans;
}

不是

image
这一段还是原来的写法

		for(int i=a[1];i<=a[len];i++){
			if(vis[i]) continue;//到站的不算
			for(int j=1;j<=len;j++)
				if(!l[i][a[j]]){//如果没建边 
					in[a[j]]++;//低级的站台入度+1 
					g[i].push_back(a[j]);//建边
					l[i][a[j]]=1;//标记已建边 
				}
		}

就是说这些东西还是放在单独的循环里??

呃,等一下

这样吗

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[1005], o[1005], in[1005], dp[1005], d[1005], vis[1005];
vector<ll> v[1005];
ll b[1005][1005];
int main(){
    ll n, m;
    cin >> n >> m;
    for(ll i=1;i<=m;i++){
        ll ln;
        cin>>ln;
        memset(vis,0,sizeof(vis));
        for(ll j=1;j<=ln;j++){
            cin >> s[i];
            vis[s[i]]=1;
        }
        for(ll i=s[1];i<=s[ln];i++){
            if(vis[i]) continue;
            for(ll j=1;j<=ln;j++){
                if(!b[i][s[j]]){//如果没建边 (因为我们是需要从没到站的向到站的建边,题目说等级更高的一定进站,即是高级的指向低级的)
                    in[s[j]]++;//低级的站台入度+1 
                    // o[i]++;
                    v[i].push_back(s[j]);//用vector建边
                    // v[s[j]].push_back(i);
                    // b[s[j]][i]=1;
                    b[i][s[j]]=1;//标记已建边
                }
            }
        }
    }
    queue<ll> q;
	for(ll i=1;i<=n;i++){
		if(in[i]==0){
            dp[i]=1;
			q.push(i);
		}
	}
    ll ans=0;
    
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll k:v[u]){	
            in[k]--;
            if(in[k]==0){ dp[k]=max(dp[u]+1,dp[k]);            ans=max(dp[k], ans);}
			if(in[k]==0) q.push(k);
		} // 不用vis数组!!!!
	}
    cout << ans;
}

就是说

for(i:1~m){
    //输入ln
    //清空vis数组
    //输入站台编号,标记
    for(i:s[1]~s[ln]){
        //如果到站跳过
        for(j:1~ln){//遍历到达的站
            if(!l[i][s[j]]){//没有建过边
                //站台入度+1
                //vetcor数组建边
                //标记已经建边
            }
        }
    }
}

对的

是这样

样例没过