[NOIP2013普及组]车站分级
2018-01-27 20:17
239 查看
题目中说,如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。也就是说,这趟车次经过且不停靠的所有车站的级别都必须小于这趟车次停靠的所有车站的级别。
因此,可以确定某些车站两两之间的大小关系。将这些可以确定大小关系的车站,由等级低的车站向等级高的车站连一条边,然后利用拓扑排序,满足这些关系。在拓扑排序的过程中,做一个简单的递推就可以得出每个车站的等级,从而得出不同等级的数量。
代码如下
因此,可以确定某些车站两两之间的大小关系。将这些可以确定大小关系的车站,由等级低的车站向等级高的车站连一条边,然后利用拓扑排序,满足这些关系。在拓扑排序的过程中,做一个简单的递推就可以得出每个车站的等级,从而得出不同等级的数量。
代码如下
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; #define pii pair<int,int> const int e=1e3+5; int s[e][e],n,m,ans,ru[e],vis[e],tot,pd[e][e]; queue<pii>q; vector<int>g[e]; inline int getint()//读入优化 { char ch; int res=0; while(ch=getchar(),ch<'0'||ch>'9'); res=ch-48; while(ch=getchar(),ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+ch-48; return res; } inline void bfs()//拓扑排序 { int i; for(i=1;i<=n;i++) if(ru[i]==0) q.push(make_pair(i,1));//没有入度,级别最低 ans=1; while(!q.empty()) { int u=q.front().first,val=q.front().second; //队列中的每个元素有2个关键字,第一个是车站编号,第二个是级别 q.pop(); for(i=0;i<g[u].size();i++) { int v=g[u][i]; ru[v]--; if(ru[v]==0) { q.push(make_pair(v,val+1));//递推,当前点的级别为val+1 ans=max(ans,val+1);//ans记录最高级别,也就是不同级别的数量 } } } } int main() { int i,j,x; n=getint(); m=getint(); for(i=1;i<=m;i++) { s[i][0]=getint();//s[i][0]为车次i停靠的车站数量 memset(vis,false,sizeof(vis)); for(j=1;j<=s[i][0];j++) { x=getint(); s[i][j]=x;//s[i][j]表示车次i停靠的第j个车站 vis[x]=true;//当前车次有停靠x } for(j=s[i][1];j<=s[i][s[i][0]];j++)//枚举经过的所有车站(不一定停靠) { if(vis[j])continue;//这条路上所有不停靠的必须比所有停靠的级别低 for(int k=1;k<=s[i][0];k++) if(!pd[j][s[i][k]])//pd判断这条边是否还没连 { ru[s[i][k]]++;//入度+1 g[j].push_back(s[i][k]); //j向s[i][k]连边,表示j的级别必须比s[i][k]低 pd[j][s[i][k]]=true;//标记为连过的边 } } } bfs(); cout<<ans<<endl; return 0; }
相关文章推荐
- 【图论经典题】NOIP2013 普及组 T4 车站分级(两种方法)
- NOIP2013普及组-车站分级
- NOIP 2013 普及组 复赛 level 车站分级
- NOIP2013 普及组 车站分级
- 【NOIP2013 普及组】车站分级
- 洛谷 P1983 [NOIP2013普及组 T4] 车站分级
- [NOIp2013普及组]车站分级
- NOIP2013P4 车站分级 题解
- NOIP2013pj车站分级[拓扑排序]
- noip2013 车站分级
- NOIP 2013 车站分级
- luogu1983【2013普及】车站分级(拓扑排序)
- NOIp2013 车站分级 【拓扑排序】By cellur925
- noip2013 车站分级 (拓扑排序)
- NOIP2013 车站分级
- Luogu1983 [NOIP2013]车站分级 解题报告【图论】【拓扑排序】【栈】
- NOIP2013 车站分级
- 拓扑排序以及队列栈的使用 (车站分级noip2013第四题)
- [置顶] NOIP 普及组 车站分级 [拓扑排序][线段树优化连边][虚点优化]
- NOIP2013车站分级