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;
}

 

posted @ 2023-08-07 13:57  o-Sakurajimamai-o  阅读(112)  评论(0编辑  收藏  举报
-- --