1

~ 2025-11-16 16:03:58

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+5;
const int Mod = 1e9+7;
struct node{
	int v,w;
};
int n,m,dis[N],book[N],cnt[N],f[N],g[N];
vector<node>e[N];
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		e[x].push_back({y,z});
	}
	priority_queue<pair<int,int> >q;
	memset(dis,0x3f,sizeof(dis));
	dis[1] = 0;
	q.push({0,1});
	memset(g,0x3f,sizeof(g));
	f[1] = g[1] = 0;
	cnt[1] = 1;
	while(!q.empty()){
		int tmp = q.top().second;
		q.pop();
		if(book[tmp])continue;
		book[tmp] = 1;
		for(auto T:e[tmp]){
			int v = T.v;
			int w = T.w;
			if(dis[v]>dis[tmp]+w){
				dis[v] = dis[tmp]+w;
				cnt[v] = cnt[tmp];cnt[v]%=Mod;
				g[v] = g[tmp]+1;
				f[v] = f[tmp]+1;
				q.push({-dis[v],v});
			}
			else if(dis[v]==dis[tmp]+w){
				cnt[v]+=cnt[tmp];cnt[v]%=Mod;
				g[v] = min(g[v],g[tmp]+1);
				f[v] = max(f[v],f[tmp]+1);
			//	q.push({-dis[v],v}); 
			}
		}
	}
	cout<<dis[n]<<" "<<cnt[n]<<" "<<g[n]<<" "<<f[n]<<endl;
	return 0;
}
/*
10 20
6 7 5
7 6 5
10 8 4
1 2 3
4 5 2
2 3 2
7 9 4
7 4 5
5 7 2
5 6 3
6 7 4
7 8 5
3 8 5
2 7 4
9 10 5
2 3 5
8 9 3
3 4 3
9 8 2
3 7 1

*/
#include <bits/stdc++.h>
/*
 * f[i][j] = f[f[i][j-1]][j-1]
 */
using namespace std;
#define int long long
const int N = 2e5+5;
int n,m,f[N][35];
vector<int>e[N];
signed main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        int x;
        cin>>x;
        e[i].push_back(x);
        f[i][0] = x;
    }
    for (int j=1;j<=34;j++) {
        for (int i=1;i<=n;i++) {
            f[i][j] = f[f[i][j-1]][j-1];
        }
    }
    for (int i=1;i<=m;i++) {
        int x,y;
        cin>>x>>y;
        for (int j=34;j>=0;j--) {
            if (y>=(1LL<<j)) {
                x = f[x][j];
                y-=(1LL<<j);
            }
        }
        cout<<x<<endl;
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5;
int n,m,nxt[N],f[N][35],vis[N],dep[N];
void dfs(int x) {
    vis[x] = 1;
    if (!vis[nxt[x]]) {
        dfs(nxt[x]);
    }
    dep[x] = dep[nxt[x]]+1;
}
int Go(int x,int y) {
    for (int j=34;j>=0;j--) {
        if (y>=(1LL<<j)) {
            x=f[x][j];
            y-=(1LL<<j);
        }
    }
    return x;
}
signed main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        cin>>nxt[i];
        f[i][0] = nxt[i];
    }
    for (int j=1;j<=34;j++) {
        for (int i=1;i<=n;i++) {
            f[i][j] = f[f[i][j-1]][j-1];
        }
    }
    for (int i=1;i<=n;i++) {
        if (!vis[i])dfs(i);
    }
    for (int i=1;i<=m;i++) {
        int x,y;
        cin>>x>>y;
        int dx=dep[x],dy=dep[y],dz=Go(x,dx);
        int res = -1;
        if (dx>=dy && Go(x,dx-dy)==y)res=dx-dy;
        else if (Go(dz,dep[dz]-dy)==y)res=dep[dz]-dy+dx;
        cout<<res<<endl;
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,book[N],vis[N],pre[N],ans[N];
vector<int>e[N];
void dfs(int x)
{
	book[x] = 1;
	for(int i=0;i<e[x].size();i++){
		int v = e[x][i];
		if(vis[v]==0){
			ans[v] = ans[x]+1;
			dfs(v);
			//cout<<v<<" "<<x<<endl;
		//	cout<<ans[v]<<"   "<<ans[x]<<endl;
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		e[x].push_back(i);
		pre[i] = x;
	}
	for(int i=1;i<=n;i++){
		if(!book[i]){
			int v = i;
			while(book[v]==0){
				book[v] = 1;
				v = pre[v];
			}
			int st = v;
			vector<int>circle;
			do{
				vis[st] = 1;
				circle.push_back(st);
				st = pre[st];
			}while(st!=v);
			for(auto rt:circle){
		//		cout<<rt<<endl;
				ans[rt] = circle.size();
				dfs(rt);
			}
		}
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<" ";
	}
	return 0;
}


我们会审查剪贴板内容,并对发布不合适内容的同学进行相应的处理