我看到网上有很多做法,什么-0转-1000的。
但是我觉得完全可以开一个数组去记录这些东西的±就行了。
所以采用了以下的极度简单的做法
使用一个st数组记录他的性别
come数组记录他是否出现过(这个不知道是不是必须的,没有去尝试)
node二维记录两个点之间的亲密度,一开始想复杂了,使用了结构体,可以直接改成double数组
思路
先录入各种信息填补以上的数组
然后先寻找两者最大的节点编号,比较是否互相都是最大的,如果不是则执行第3步,如果是就输出就行
先按编号从小到大寻找最大亲密值的编号就行。
#include<iostream>
#include<vector>
using namespace std;
int const N=1e3+10;
int n,m,k,x,y;
bool st[N];
bool come[N];//这个判断是否来过,别没有的也上了
struct Node{
double x=0;
}node[N][N];
//是这样想的,node可以排序,然后肯定要存异性的东西的
//然后升序排序
int main(){
//第1步
cin>>n>>m;
while(m--){
cin>>k;
vector<int> v1,v2;
for(int i=0;i<k;i++){
string t1;
cin>>t1;
int t=stoi(t1);
if(t1.find("-")!=0){
st[abs(t)]=true;
v1.push_back(t);
}
else{
v2.push_back(t);
}
come[abs(t)]=true;
}
for(int i=0;i<v1.size();i++){
for(int j=0;j<v2.size();j++){
int a=v1[i],b=v2[j];
node[abs(a)][abs(b)].x+=(double)1/k,node[abs(b)][abs(a)].x+=(double)1/k;
}
}
}
cin>>x>>y;
int absx=abs(x);
int absy=abs(y);
double maxx=0,maxy=0,xi=0,yi=0;
//第2步
for(int i=0;i<n;i++){
bool fy=st[absy]*!st[i]+!st[absy]*st[i];
bool fx=st[absx]*!st[i]+!st[absx]*st[i];
if(fx)
if(maxx<=node[abs(x)][i].x)
maxx=node[abs(x)][i].x,xi=i;
if(fy)
if(maxy<=node[abs(y)][i].x)
maxy=node[abs(y)][i].x,yi=i;
}
//第3步
if(xi==absy&&yi==absx){
string c1=to_string(absx);
string c2=to_string(absy);
if(!st[absx])c1='-'+to_string(absx);
if(!st[absy])c2='-'+to_string(absy);
cout<<c1<<" "<<c2<<endl;
}
else{
for(int i=0;i<n;i++){
bool fx=st[absx]*!st[i]+!st[absx]*st[i];
if(fx&&node[abs(x)][i].x==maxx&&come[i]){
string c1=to_string(absx);
string c2=to_string(i);
if(!st[absx])c1='-'+to_string(absx);
if(!st[i])c2='-'+to_string(i);
cout<<c1<<" "<<c2<<endl;
}
}
for(int i=0;i<n;i++){
bool fy=st[absy]*!st[i]+!st[absy]*st[i];
if(fy&&node[absy][i].x==maxy&&come[i]){
string c1=to_string(absy);
string c2=to_string(i);
if(!st[absy])c1='-'+to_string(absy);
if(!st[i])c2='-'+to_string(i);
cout<<c1<<" "<<c2<<endl;
}
}
}
}