P1983 車站分級(拓撲排序)

P1983 車站分級(拓撲排序)

傳送門

思路 :將每個車次車站的關係抽象化爲邊的關係,不停靠的車站等級肯定比停靠的車站等級低,因此可以建立一條邊,然後就用拓撲排序搞搞就行了,注意判斷重邊。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
#define mst(a) memset(a,0,sizeof a)
int n,m,in[N],vis[N],a[N];
bool edge[N][N];
vector<int>e[N];
int toposort(){
	queue<pair<int,int> >q;
	int ans=1;
	for(int i=1;i<=n;i++) if(!in[i]) q.push({i,1});
	while(q.size()){
		int u=q.front().first;
		int g=q.front().second;
		q.pop();
		for(auto v:e[u]){
			in[v]--;
			if(!in[v]) q.push({v,g+1}),ans=max(ans,g+1);//找到最大等級. 
		}
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,cnt;i<=m;i++){
		 scanf("%d",&cnt);
		 mst(vis);
		 for(int j=1;j<=cnt;j++)
		  scanf("%d",&a[j]),vis[a[j]]=1;
		 for(int j=a[1];j<=a[cnt];j++)
		 	if(!vis[j])
		 		for(int k=1;k<=cnt;k++)
		 			if(!edge[j][a[k]]) edge[j][a[k]]=1,e[j].push_back(a[k]),in[a[k]]++;
	}
	printf("%d\n",toposort());
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章