救救我.py

如果还有问题发我哈

哦,懂了懂了

l数组是干啥的

标记这俩有没有建边

出度没有记吗

没有记出度,输出为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++){
        cin >> s[i];
        vis[s[i]]=1;
    }
    for(ll i=1;i<=n;i++){
        if(vis[i]) continue;
        for(ll j=1;j<=v[i].size();j++){
            if(!b[i][s[j]]){//如果没建边 (因为我们是需要从没到站的向到站的建边,题目说等级更高的一定进站,即是高级的指向低级的)
                in[i]++;//低级的站台入度+1 
                v[i].push_back(s[j]);//用vector建边
                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);
		}
	}
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll k:v[u]){	
            in[k]--;
            dp[k]=max(dp[u]+1,dp[k]);
			if(in[k]==0) q.push(k);
		}
	}
    ll ans=0;
    for(ll i=1;i<=n;i++){
        if(o[i]==0){
            ans=max(dp[i], ans);
        }
    }
    cout << ans/2+1;
}

加了个出度,还是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++){
        cin >> s[i];
        vis[s[i]]=1;
    }
    for(ll i=1;i<=n;i++){
        if(vis[i]) continue;
        for(ll j=1;j<=v[i].size();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);
		}
	}
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll k:v[u]){	
            in[k]--;
            dp[k]=max(dp[u]+1,dp[k]);
			if(in[k]==0) q.push(k);
		} // 不用vis数组!!!!
	}
    ll ans=0;
    for(ll i=1;i<=n;i++){
        if(o[i]==0){
            ans=max(dp[i], ans);
        }
    }
    cout << ans/2+1;
}

@吴梓峤 在吗

在的

孩子,建单向边
image

还有这个o数组也不要
还有这里和平时不同,dp 数组的更新要在 in[k]==0 的情况下
最后,取答案时,直接遍历 i:1->n 取最大的 dp[i] 不要 ans/2+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++){
        cin >> s[i];
        vis[s[i]]=1;
    }
    for(ll i=1;i<=n;i++){
        if(vis[i]) continue;
        for(ll j=1;j<=v[i].size();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);
		}
	}
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll k:v[u]){	
            in[k]--;
            dp[k]=max(dp[u]+1,dp[k]);
			if(in[k]==0) q.push(k);
		} // 不用vis数组!!!!
	}
    ll ans=0;
    for(ll i=1;i<=n;i++){
        if(in[i]==0){
            ans=max(dp[i], ans);
        }
    }
    cout << ans;
}

样例还是输出1

image
这个不要

你没看玩吧
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=1;i<=n;i++){
        if(vis[i]) continue;
        for(ll j=1;j<=v[i].size();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);
		}
	}
	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]);
			if(in[k]==0) q.push(k);
		} // 不用vis数组!!!!
	}
    ll ans=0;
    for(ll i=1;i<=n;i++){
            ans=max(dp[i], ans);
    }
    cout << ans;
}

嗯,是啊

输出1

样例还是不对

!!!666