问题标题: 酷町堂:1435

0
0
已解决
徐熙晨
徐熙晨
新手光能
新手光能

RT 

#include<bits/stdc++.h>
using namespace std;
int n,m,s,g[10000][10000],vis[10000],lst[10000],ind[10000],ans=0;
int st[10000],top=0,buf[10000],top2=0;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9')
    {
        if(c=='-')
        f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
void toposort(){
    for(int i=1;i<=n;i++) 
        if(ind[i]==0) 
            st[++top]=i;
    while(top)
    {
        ans++;
        while(top)
        {
            int u=st[top--];  
            for(int v=1;v<=n;v++) if(g[u][v]){
                ind[v]--;   
                if(ind[v]==0) buf[++top2]=v;
            }
        }
        for(int i=1;i<=top2;i++) st[i]=buf[i];
        top=top2;
        top2=0;
    }
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++)
    {
        s=read();
        memset(vis,0,sizeof(vis));
        for(int j=1;j<=s;j++) lst[j]=read(),vis[lst[j]]=1;
        for(int j=lst[1];j<=lst[s];j++) if(!vis[j])
            for(int k=1;k<=s;k++) if(!g[lst[k]][j]) g[lst[k]][j]=1,ind[j]++;
    }
    toposort();
    printf("%d",ans);
    return 0;
}

请各位大佬纠错

徐熙晨在2018-04-26 16:51:22追加了内容

@酷町喵~o( =∩ω∩= )o~ @黄俊博 @梁彦博 @梁锦程@陆麟瑞 


0
已采纳
陆麟瑞
陆麟瑞
资深天翼
资深天翼

首先你的思路不对,这题不是拓扑排序,而是求最长路径。先建好图,之后DFS搜索求出最长路径即可

0
0
0
我要回答