#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, instk[N], vis[N]; //vis判断是否走过,instk判断是否在栈里
vector<pair<int, int> >e[N];
stack<int>stk;
vector<int>circle;
void dfs(int x, int id) {
stk.push(x);
instk[x] = 1;
vis[x] = 1;
for (auto v : e[x]) {
if (v.second == id)
continue;
if (vis[v.first] == 0) {
dfs(v.first, v.second);
} else if (instk[v.first]) {
int V;
do {
V = stk.top();
stk.pop();
circle.push_back(V);
instk[V] = 0;
} while (V != v.first);
}
}
if (instk[x])
stk.pop();
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back({y, i});
e[y].push_back({x, i});
}
dfs(1, 0);
sort(circle.begin(), circle.end());
for (auto v : circle) {
cout << v << " ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, vis[N], instk[N], inring[N];
vector<int>e[N], g[N];
stack<int>stk;
vector<int>ring[N];
int id[N], siz[N], dis[N], tot;
int nxt[N];
void dfs(int x) {
vis[x] = 1;
stk.push(x);
instk[x] = 1;
for (auto v : e[x]) {
if (vis[v] == 0) {
dfs(v);
} else if (instk[v]) {
int V;
++tot;
do {
V = stk.top();
stk.pop();
instk[V] = 0;
id[V] = tot;
ring[tot].push_back(V);
inring[V] = 1;
} while (V != v);
}
}
if (instk[x]) {
stk.pop();
instk[x] = 0;
}
}
void dfs2(int x, int ID) {
for (auto v : g[x]) {
if (inring[v] == 1)
continue;
dis[v] = dis[x] + 1;
id[v] = ID;
dfs2(v, ID);
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int fa;
cin >> fa;
e[i].push_back(fa);
g[fa].push_back(i);
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
dfs(i);
}
}
for (int i = 1; i <= tot; i++) {
for (auto v : ring[i]) {
dis[v] = 0;
dfs2(v, i);
}
}
for (int i = 1; i <= n; i++) {
cout << dis[i] + ring[id[i]].size() << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, vis[N], instk[N], ring[N];
int flag, mx = 1e9;
struct node {
int v, id;
};
stack<int>stk;
bool cmp(node a, node b) {
return a.v < b.v;
}
vector<node>e[N];
void dfs60(int x, int id) {
sort(e[x].begin(), e[x].end(), cmp);
cout << x << " ";
for (auto [v, ID] : e[x]) {
if (ID == id)
continue;
dfs60(v, ID);
}
}
void GetRing(int x, int id) {
instk[x] = 1;
vis[x] = 1;
stk.push(x);
for (auto [v, ID] : e[x]) {
if (ID == id)
continue;
if (!vis[v])
GetRing(v, ID);
else if (instk[v]) {
int V;
do {
V = stk.top();
stk.pop();
instk[V] = 0;
ring[V] = 1;
} while (V != v);
}
}
if (instk[x])
stk.pop();
}
void dfs100(int x, int id, int fa) {
cout << x << " ";
vis[x] = 1;
sort(e[x].begin(), e[x].end(), cmp);
for (int i = 0; i < e[x].size(); i++) {
int v = e[x][i].v;
int ID = e[x][i].id;
if (ID == id)
continue;
if (vis[v])
continue;
if (!ring[v])
dfs100(v, ID, x);
else {
if (flag == 0) {
int t;
if (i == e[x].size() - 1)
t = mx;
else
t = e[x][i + 1].v;
if (t == fa) {
if (i != e[x].size() - 2)
mx = e[x][i + 2].v;
} else
mx = t;
}
if (mx < v && !flag) {
flag = 1;
continue;
} else
dfs100(v, ID, x);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
e[x].push_back({y, i});
e[y].push_back({x, i});
}
if (m == n - 1)
dfs60(1, 0);
else {
//1.找环
GetRing(1, 0);
memset(vis, 0, sizeof(vis));
dfs100(1, 0, 0);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+5;
/*
1.找环
2.对环上每一个节点跑树上dp
3.在环上跑dp
*/
int n,a[N],fa[N],vis[N],incircle[N];
int f[N][2],g[N][2];
vector<int>e[N];
void dfs(int x)
{
vis[x] = 1;
f[x][0] = 0;
f[x][1] = a[x];
for(auto v:e[x]){
if(incircle[v]==1)continue;
dfs(v);
f[x][0]+=max(f[v][0],f[v][1]);
f[x][1]+=f[v][0];
}
}
signed main(){
cin>>n;
int res = 0;
for(int i=1;i<=n;i++){
cin>>a[i]>>fa[i];
e[fa[i]].push_back(i);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
int tmp = i;
while(!vis[tmp]){
vis[tmp] = 1;
tmp = fa[tmp];
}
//tmp点一定在环上
int st = fa[tmp];
vector<int>circle;
circle.push_back(tmp);
incircle[tmp] = 1;
while(st!=tmp){
circle.push_back(st);
incircle[st] = 1;
st = fa[st];
}
for(auto v:circle){
dfs(v);
}
// for(auto v:circle){
// cout<<v<<" "<<f[v][0]<<" "<<f[v][1]<<endl;
// }
//环上dp
int ret = 0;
for(int t=1;t<=2;t++){
//t==1不选起点
if(t==1){
g[0][0] = f[circle[0]][0];
g[0][1] = -9e18;
}
else{
g[0][0] = -9e18;
g[0][1] = f[circle[0]][1];
}
for(int j=1;j<circle.size();j++){
g[j][0] = max(g[j-1][0],g[j-1][1])+f[circle[j]][0];
g[j][1] = g[j-1][0] + f[circle[j]][1];
}
if(t==1)ret = max(ret,max(g[circle.size()-1][0],g[circle.size()-1][1]));
else ret = max(ret,g[circle.size()-1][0]);
}
// cout<<ret<<endl;
res+=ret;
}
}
cout<<res<<endl;
return 0;
}