作业介绍

#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;
}
状态
已结束
题目
11
开始时间
2026-10-3 0:00
截止时间
2026-10-11 23:59
可延期
24 小时