1. 程式人生 > >noip普及組2013 車站分級(luogu P1983)

noip普及組2013 車站分級(luogu P1983)

eof 矩陣 oid har 一個 org pac 題目 style

原題鏈接:https://www.luogu.org/problem/show?pid=1983

題目大意:每個車站有一個權值,每一車次始發站與終點站之間如果有不停靠的點,那麽它的權值一定比停靠的點的權值都要小。

處理完m條線路後,能夠得到一系列的大小關系,於是就可以通過拓撲排序求出結果。

幾個需要註意的地方:有的邊可能已經被加過一次,所以最好用鄰接矩陣存邊,避免點的度數被重復加。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; 
void read(int
&y) { y=0;char x=getchar(); while(x<0||x>9) x=getchar(); while(x>=0&&x<=9) { y=y*10+x-0; x=getchar(); } } int n,m,x,ans,top; int p[1005],d[1005],l[1005]; int e[1005][1005],st[1005]; bool b[1005],vis[1005]; int main() { read(n);read(m); for(int
i=1;i<=m;i++) { memset(b,0,sizeof(b)); read(x); for(int j=1;j<=x;j++) { read(p[j]); b[p[j]]=1; } for(int j=p[1];j<=p[x];j++) { if(b[j]!=0) continue; for(int k=1;k<=x;k++) {
if(e[j][p[k]]!=0) continue; e[j][p[k]]=1; d[p[k]]++; } } } top=0; for(int i=1;i<=n;i++) { if(d[i]==0) { st[++top]=i; l[i]=1; } } for(int i=1;i<=top;i++) { for(int j=1;j<=n;j++) { if(e[st[i]][j]==0) continue; e[st[i]][j]=0; d[j]--; if(d[j]==0) { l[j]=l[st[i]]+1; ans=max(ans,l[j]); st[++top]=j; } } } printf("%d",ans); return 0; }

noip普及組2013 車站分級(luogu P1983)