感觉是不是很久没做水题了,最近开始各种坑,不论是训练还是CF。。。
加之要去长春赛区,感觉中大出题有点偏向CF风格?所以最近打算把CF上tags 带graphs的都做做吧。
这个题挺水的,直接根据题意,枚举起点然后bfs找最长路就行了。讽刺的是,当时做这场DIV2的时候题都没看懂。。。
#include<algorithm> #include<iostream> #include<cstring> #include<fstream> #include<sstream> #include<vector> #include<string> #include<cstdio> #include<bitset> #include<queue> #include<stack> #include<cmath> #include<map> #include<set> #define FF(i, a, b) for(int i=a; i<b; i++) #define FD(i, a, b) for(int i=a; i>=b; i--) #define REP(i, n) for(int i=0; i<n; i++) #define CLR(a, b) memset(a, b, sizeof(a)) #define debug puts("**debug**") #define LL long long #define PB push_back #define MP make_pair #define eps 1e-8 using namespace std; const int maxn = 1e5 + 10; int n, c[maxn], fa[maxn], d[maxn], out[maxn]; vector<int> G[maxn]; int ans, max_len, t, ss, tt; void bfs(int x) { queue<int> q; q.push(x); CLR(d, -1); d[x] = max_len = 0; fa[x] = -1; t = x; while(!q.empty()) { int u = q.front(); q.pop(); REP(i, G[u].size()) { int v = G[u][i]; //按题意要求走 if(d[v] != -1 || c[v] == 1) continue; if(out[v] != 1) continue; //记录 d[v] = d[u] + 1; fa[v] = u; q.push(v); if(d[v] > max_len) max_len = d[v], t = v; } } } int main() { scanf("%d", &n); FF(i, 1, n+1) scanf("%d", &c[i]); FF(i, 1, n+1) { scanf("%d", &t); if(t) G[i].PB(t), G[t].PB(i), out[t]++; } ans = -1; FF(i, 1, n+1) if(c[i]) { bfs(i); if(d[t] > ans) ans = d[t], ss = i, tt = t; } bfs(ss); printf("%d\n", ans+1); while(tt != -1) { printf("%d ", tt); tt = fa[tt]; } return 0; }