给你一张有向完全图,注意是完全图,也就是说,任意两个点有一条有向边。
给定每一个点的入度,问你能否找到一对 \((a,b)\) 满足有一条从 \(a\) 到 \(b\) 的路径,也有一条从 \(b\) 到 \(a\) 的路径,如果存在,请输入入度差最大的一对,输出 ! a b,如果不存在输出 ! 0 0
你可以进行询问 :\(?\,\,a\,\,b\) 表示,是否存在一条路径从 \(a\) 到 \(b\)
如果存在,则输出 \(YES\) ,不存在则输出 \(NO\)
你可以进行无数次的询问,直到输出 \(YES\)
首先它是一个有向完全图,如果 \((a,b)\) 询问为 YES,那么进行分析:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 5e2 + 10;
const int mod = 1e9 + 7;
struct node{
int u,v,d;
}e[maxn*maxn];
int in[maxn];
bool cmp(node a,node b){
return a.d>b.d;
}
char s[maxn];
bool ask(int u,int v){
printf("? %d %d\n",u,v);
fflush(stdout);
scanf("%s",s);
if(s[0]==‘Y‘) return true;
return false;
}
int main(){
int n,now = 0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&in[i]);
for(int i=1;i<=n;i++) {
for (int j = i + 1; j <= n; j++) {
int u = i, v = j;
if (in[u] < in[v]) swap(u, v);
e[++now] = {u, v, in[u] - in[v]};
}
}
sort(e+1,e+1+now,cmp);
for(int i=1;i<=now;i++){
auto u = e[i].u;
auto v = e[i].v;
if(ask(u,v)){
printf("! %d %d\n",u,v);
fflush(stdout);
return 0;
}
}
printf("! 0 0\n");
fflush(stdout);
return 0;
}
原文:https://www.cnblogs.com/EchoZQN/p/14608743.html