1 条题解

  • 0
    @ 2025-10-10 20:13:35

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    
    /*
    反向考虑每个点可以到哪些点,从编号最大的点开始考虑
    如果编号大的点能到,编号小的点就可以不走了,这样每个点最多被访问一次 
    */
    vector<int> a[100010];
    int ma[100010];//存储每个点可以走到的最大的编号 
    bool f[100010];
    
    //x点,来自哪个最大点 
    void dfs(int x,int from){
    	//如果该点来自哪个点,没有被求过 
    	if(ma[x]==0){
    		ma[x] = from;
    		for(int i = 0;i < a[x].size();i++){
    			dfs(a[x][i],from);
    		}
    	}
    } 
    
    int n,m;
    int main(){
    	cin>>n>>m;
    	int x,y;
    	for(int i = 1;i <= m;i++){
    		cin>>x>>y;
    		a[y].push_back(x);
    	}
    	
    	for(int i = n;i >= 1;i--){
    		dfs(i,i);//从i点开始搜索		
    	}
    	
    	for(int i = 1;i <= n;i++){
    		cout<<ma[i]<<" ";
    	}
    }
    
    • 1

    信息

    ID
    1093
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者