noip普及組2013 車站分級(luogu P1983)
阿新 • • 發佈:2017-10-24
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(inti=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)