1139 First Contact (30分)
程序员文章站
2022-07-14 12:38:57
...
Sample Input:
10 18
-2001 1001
-2002 -2001
1004 1001
-2004 -2001
-2003 1005
1005 -2001
1001 -2003
1002 1001
1002 -2004
-2004 1001
1003 -2002
-2003 1003
1004 -2002
-2001 -2003
1001 1003
1003 -2001
1002 -2001
-2002 -2003
5
1001 -2001
-2003 1001
1005 -2001
-2002 -2004
1111 -2003
Sample Output:
4
1002 2004
1003 2002
1003 2003
1004 2002
4
2001 1002
2001 1003
2002 1003
2002 1004
0
1
2003 2001
0
遇到的坑
1.id要用4位输出,如果是用int存的宝贝们,输出的时候需要%04d~
2.A->C B->D的过程中可能出现 A->B 或 B->A,要把这种情况考虑进去,害,花里胡哨的
3.有一种输入情况是0000或-0000,如果用正常的0存进去的话会无法判断0000的正负(男女), 因为给定的id范围是4位的,所以我们用5位的10001存0000,-10001存-0000,装入结果的时候再修改回来就ok拉~
以下是代码:
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
struct node{ int c,d; };
bool cmp(node a,node b){ return a.c!=b.c?a.c<b.c:a.d<b.d; }
int main(){
int n,m,q,a,b;
cin>>n>>m;
map<int,set<int>> data;
for(int i=0;i<m;i++){
string temp_a,temp_b;
cin>>temp_a>>temp_b;
if(temp_a[0]=='-'&&stoi(temp_a)==0)
a=-10001;
else if(temp_a[0]!='-'&&stoi(temp_a)==0)
a=10001;
else
a=stoi(temp_a);
if(temp_b[0]=='-'&&stoi(temp_b)==0)
b=-10001;
else if(temp_b[0]!='-'&&stoi(temp_b)==0)
b=10001;
else
b=stoi(temp_b);
data[a].insert(b);
data[b].insert(a);
}
cin>>q;
while(q--){
cin>>a>>b;
vector<node> ans;
for(auto ita=data[a].begin();ita!=data[a].end();ita++)
for(auto itb=data[b].begin();itb!=data[b].end();itb++)
if(*ita!=b&&*itb!=a&&*ita*a>0&&*itb*b>0&&data[*ita].find(*itb)!=data[*ita].end()){
ans.push_back({abs(*ita)==10001?0:abs(*ita),abs(*itb)==10001?0:abs(*itb)});
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++)
printf("%04d %04d\n",ans[i].c,ans[i].d);
}
return 0;
}
上一篇: jQuery 教程
下一篇: 分布式理论之拜占庭将军问题