记录编号 |
154809 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2013]车站分级 |
最终得分 |
100 |
用户昵称 |
yun |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.353 s |
提交时间 |
2015-03-25 09:21:13 |
内存使用 |
1.28 MiB |
显示代码纯文本
#include<fstream>
#include<cstring>
#include<queue>
using namespace std;
ifstream fin("level2013.in");
ofstream fout("level2013.out");
const int SIZE=1001;
bool map[SIZE][SIZE],a[SIZE];//a用来记录哪些没有经过,b记录所有经过的点
int n,m,degree[SIZE],b[SIZE];
int main(){
fin>>n>>m;
//输入,并建立图
int si,ti,co;
for(int i=1;i<=m;i++){
fin>>si;
co=0;
memset(a,0,sizeof(a));
//输入si个数,记录哪些有,哪些没有
for(int j=1;j<=si;j++){
fin>>ti;
b[++co]=ti;
a[ti]=1;
}
//开始建立图,所有没有经过的,都要向所有经过的建一条边
for(int j=b[1];j<=b[co];j++){
if(!a[j]){
for(int p=1;p<=co;p++)
if(!map[j][b[p]]){map[j][b[p]]=1;degree[b[p]]++;}
}
}
}
//将所有入度为0的点放到一个栈里面
queue<int> q;
for(int i=1;i<=n;i++){
if(!degree[i]) q.push(i);
}
//开始进行拓扑排序,找到最长路径
int ans=0;
while(!q.empty()){
si=q.size();
ans++;
for(int i=1;i<=si;i++){
ti=q.front();
q.pop();
//将所有相连的边去掉
for(int j=1;j<=n;j++){
if(map[ti][j]){
degree[j]--;
if(degree[j]==0) q.push(j);
}
}
}
}
fout<<ans<<endl;
return 0;
}