1 条题解

  • 0
    @ 2026-5-5 16:49:40
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    int n,m,x,y,d[N];
    bool vis[N],ins[N];
    vector<int>g[N];
    queue<int>q;
    void dfs(int x){
    	vis[x]=ins[x]=1;
    	for(int y:g[x]) if(!ins[y]){
    		d[y]++;
    		if(!vis[y]) dfs(y);
    	}
    	ins[x]=0;
    }
    int query(int x,int y){
    	printf("? %d %d\n",x,y),fflush(stdout);
    	return scanf("%d",&x),x;
    }
    signed main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++)
    		scanf("%d%d",&x,&y),g[x].push_back(y);
    	for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);
    	for(int i=1;i<=n;i++) if(!d[i]) q.push(i);
    	while(q.size()>1){
    		x=q.front(),q.pop(),y=q.front(),q.pop();
    		if(!query(x,y)) swap(x,y);
    		for(int i:g[y]) if(!--d[i]) q.push(i);
    		q.push(x);
    	}
    	printf("! %d",q.front());
    	return 0;
    }
    
    • 1

    信息

    ID
    6861
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者