
你是没看题吗?
输入格式有问题
#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,帮我看一看有啥问题

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

放到上一个循环里。
像这样:
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;
}
不是

这一段还是原来的写法
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数组建边
//标记已经建边
}
}
}
}
对的
是这样
样例没过