如果还有问题发我哈
哦,懂了懂了
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;
}
@吴梓峤 在吗
在的
孩子,建单向边

还有这个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
![]()
这个不要
你没看玩吧

我看完了啊
没问题啊
这样吗????
#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