DAG求最长路/最短路方法
首先,DAG求最短路是有四种方法,分别是 SPFA,Dijkstra,拓扑,记忆化深搜
注意,求最长路只有三种,Dijkstra不适用于最长路,我tm纠结了3个小时,操操操操操操操操操操操
// //车站分级 // //https://www.luogu.com.cn/problem/P1983 #include<bits/stdc++.h> using namespace std; const int N=1e6+10,M=1e4+10; int n,m,res,p[N],a[N],f[N],level[N]; int e[N],ne[N],h[N],idx; bool vis[N],mp[M][M]; typedef pair<int,int>pii; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void topsort() { queue<int>que; for(int i=1;i<=n;i++) if(!p[i]) que.push(i); while(!que.empty()){ int now=que.front(); que.pop(); for(int i=h[now];~i;i=ne[i]){ int j=e[i]; p[j]--; if(p[j]==0){ level[j]=level[now]+1; que.push(j); } } } } // void spfa() // { // queue<int>que; // que.push(0),level[0]=0,vis[0]=true; // while(!que.empty()){ // int now=que.front(); que.pop(); // vis[now]=false; // for(int i=h[now];~i;i=ne[i]){ // int j=e[i]; // if(level[j]<level[now]+1){ // level[j]=level[now]+1; // if(!vis[j]) vis[j]=true,que.push(j); // } // } // } // } // int dfs(int u) // { // if(f[u]) return f[u]; // for(int i=h[u];i!=-1;i=ne[i]) f[u]=max(f[u],dfs(e[i])+1); // return f[u]; // } int main() { cin>>n>>m; memset(h,-1,sizeof h); memset(level,-0x3f,sizeof level); for(int i=0;i<m;i++){ int x; cin>>x; memset(vis,false,sizeof vis); for(int j=0;j<x;j++) cin>>a[j],vis[a[j]]=true; for(int j=a[0];j<=a[x-1];j++){ if(vis[j]) continue; for(int e=0;e<x;e++) if(!mp[a[e]][j]) mp[a[e]][j]=true,add(j,a[e]),p[j]++; } } for(int i=1;i<=n;i++) add(0,i); memset(vis,false,sizeof vis); //spfa(); //topsort(); //dfs(); //for(int i=1;i<=n;i++) if(!p[i]) res=max(res,dfs(i));//dfs用 for(int i=1;i<=n;i++) cout<<level[i]<<" "; for(int i=1;i<=n;i++) res=max(res,level[i]); //cout<<res; spfa cout<<res+1;//topsort return 0; }