欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

1139 First Contact (30分)

相关标签: PAT甲级