这道题应该算是水题,但一开始想的算法却不是很好,从时间效率上应该能过,但就是超时,好的思路是将课的先后顺序记下,然后记下每门课是在第几次被学,如果发现与课的先后有矛盾,则NO。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int map[100002][2]; int idx[1002]; int main(void) { int m,n,e; bool ok; while(scanf("%d%d",&n,&m)!=EOF) { ok=true; for(int i=1;i<=m;++i) scanf("%d%d",&map[i][0],&map[i][1]); for(int i=1;i<=n;++i) { scanf("%d",&e); idx[e]=i; } for(int i=1;i<=m;++i) { if(idx[map[i][0]]>idx[map[i][1]]) { ok=false; break; } } if(ok) printf("YES/n"); else printf("NO/n"); } return 0; }