40ptsWA要判环!!!
查看原帖
40ptsWA要判环!!!
1059490
1236stdc楼主2025/7/28 18:37

反向建边,倒序用下标更新ans数组,dfs搜索,若遇统计过的点返回

#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
/*====================*/
const int N=1e5+10;
/*====================*/
const int INF = 0x3F3F3F3F;
const int MOD = 80112002;
/*====================*/
class C_Graph{//建图
public:
	int n;
	struct Edge{
		int u,v,w;
		Edge(int _u = 0,int _v = 0,int _w = 0){
			u = _u,v = _v,w = _w;
		}
		friend bool operator<(const Edge &a,const Edge &b){
			return a.w < b.w;
		}
		int operator()(int x)const{
			return u^v^x;
		}
	};
	vector<Edge>edges;
	vector<vector<int> >edge;
	
	void Init(int n){
		this -> n = n;
		edge.assign(n + 1,vector<int>());
	}
	void AddEdge(int u,int v,int w = 0){
		edges.push_back(Edge(u,v,w));
		edge[u].push_back(edges.size() - 1);
	}
};
/*====================*/
int ans[N],n;

void dfs(int res,int x, const C_Graph &g){//搜索,查点更新
	if(ans[x] != -1) return ;
	ans[x] = res;//要把自己更新
	for(auto it : g.edge[x]){
		dfs(res,g.edges[it](x),g);
	}
}
/*====================*/
void Solve(){
	int m;cin >> n >> m;
	C_Graph g;g.Init(n);
	for(int i = 1;i <= m;i++){
		int u,v;cin >> u >> v;
		g.AddEdge(v,u);
	}
	memset(ans,-1,sizeof ans);
	for(int i = n;i >= 1;i--){//从大的小搜
		dfs(i,i,g);
	}
	for(int i = 1;i <= n;i++){
		cout << ans[i] << " ";
	}
}
/*====================*/
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	int T=1;//cin>>T;
	while(T--)Solve();
	return 0;
}
2025/7/28 18:37
加载中...