luogu1983_车站分级_图论

solution

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
inline int read(){
    char ch=' ';int f=1;int x=0;
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
const int M=1e6+100;
const int N=1e3+10;
struct node
{
    int v,nxt;
}edge[M];
int head[N],cnt;
void add(int u,int v)
{
    cnt++;
    edge[cnt].v=v;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}

bool vis[N];
int a[N];
int in[N];
queue <pair<int,int> > q;
bool b[N][N];
int main()
{
    int n,m;
    n=read();m=read();
    int i,j,k;
    for(i=1;i<=m;i++)
    {
        memset(vis,0,sizeof(vis));
        int s=read();
        for(j=1;j<=s;j++) a[j]=read(),vis[a[j]]=true;
        for(j=a[1];j<=a[s];j++)
        {
            if(!vis[j])
            {
                for(k=1;k<=s;k++)
                {
                	if(!b[a[k]][j])
                    add(a[k],j),in[j]++,b[a[k]][j]=true;
                }
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        if(!in[i])
        {
            q.push(make_pair(i,1));
        }
    }
    int ans=0;
    while(!q.empty())
    {
        int u=q.front().first;
        int tot=q.front().second;q.pop();
        for(int i=head[u];i;i=edge[i].nxt)
        {
            int v=edge[i].v;
            in[v]--;
            if(!in[v])
            {
                q.push(make_pair(v,tot+1));
                ans=max(ans,tot+1);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<vector>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
inline int read(){
	char ch=' ';int f=1;int x=0;
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
const int M=5e6+100;
const int N=1e3+10;
bool vis[N];
int a[N];
int in[N];
bool cnm[N][N];
vector <int> g[N];
queue <pair<int,int> > q;
int main()
{
	int n,m;
	n=read();m=read();
	int i,j,k;
	for(i=1;i<=m;i++)
	{
		memset(vis,0,sizeof(vis));
		int s=read();
		for(j=1;j<=s;j++) a[j]=read(),vis[a[j]]=true;
		for(j=a[1];j<=a[s];j++)
			if(!vis[j])
				for(k=1;k<=s;k++)
					if(!cnm[a[k]][j])
					g[a[k]].push_back(j),in[j]++,cnm[a[k]][j]=true;
	}
	for(i=1;i<=n;i++)
		if(!in[i])
			q.push(make_pair(i,1));
	int ans=0;
	while(!q.empty())
	{
		int u=q.front().first;int tot=q.front().second;q.pop();
		ans=max(ans,tot);
		for(i=0;i<g[u].size();i++)
		{ 
			int v=g[u][i];
			in[v]--;
			if(!in[v]) 
			{
				q.push(make_pair(v,tot+1));
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_42110318/article/details/83865656
今日推荐