Statax @ 2024-04-01 12:50:19
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m;
int len;
int i,j,k;
int deg[N],stop[N];
bool will[N];
vector<int>G[N];
int toposort(){
int ans=0;
queue<pair<int,int>>q;
for(int i=1;i<=n;i++)
if(!deg[i])
q.push({i,1});
int x,now;
while(!q.empty()){
x=q.front().first;
now=q.front().second;
ans=now;q.pop();
for(auto y:G[x]){
if(!--(deg[y])){
q.push({y,now+1});
}
}
}
return ans;
}
int main(){
cin>>n>>m;
for(i=1;i<=m;i++){
memset(will,0,sizeof(will));
cin>>len>>stop[1];
for(j=2;j<=len;j++){
cin>>stop[j];
for(k=stop[j-1]+1;k<stop[j];k++){
will[k]=1;
}
}
for(j=1;j<=len;j++){
for(k=stop[1]+1;k<stop[len];k++){
if(will[k]){
G[stop[j]].push_back(k);
deg[k]++;
}
}
}
}
cout<<toposort()<<endl;
return 0;
}
by Tomzying @ 2024-04-02 13:06:52
改为邻接矩阵存图就行了,注意重边。
by fengzhaoyu @ 2024-05-18 16:36:20
@Stroap_QwQ
可以定义一个rec[i][j]表示i到j是否走过 如过走过,就不管他。
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
memset(vis,0,sizeof vis);
int k;cin>>k;
for(int j=1;j<=k;j++) cin>>a[j],vis[a[j]]=1;
for(int j=a[1];j<=a[k];j++)
{
if(!vis[j])
{
for(int s=1;s<=k;s++)
{
if(re[j][a[s]]) continue;
re[j][a[s]]=1;
g[j].push_back(a[s]);
in[a[s]]++;
}
}
}
}