PAT-A 1139

不完全ac代码
 #include<iostream>
 #include<cstdio>
 #include<vector>
 #include<algorithm>
 #include<unordered_map>
 #include<string>
 #include<cstring>
 using namespace std;
 const int MAX_N = 10001;
 unordered_map<int,vector<int> > relation;//关系网
 unordered_map<int,int> hasPath;
 int gender[MAX_N];//1表示女生,0表示男生
 int n,m,k;

 bool cmp(int a,int b){
     return a<b;
 }
 vector<pair<int,int> > solve(int a,int b){
     vector<pair<int,int> > ans;
     vector<int> fa = relation[a];//表示a的伙伴集合
     vector<int> fb = relation[b];//表示b的伙伴集合
     sort(fa.begin(),fa.end(),cmp);
     sort(fb.begin(),fb.end(),cmp);
     for(int i = 0;i<fa.size();i++){
         if (fa[i] == b || gender[fa[i]] != gender[a]) continue;
         for(int j = 0;j<fb.size();j++){
             if (fb[j] == a || gender[fb[j]] != gender[b]) continue;
             if(hasPath[10000*fa[i]+fb[j]] == 1){//表示有路径可以联通
                 ans.push_back({fa[i],fb[j]});
             }
         }
     }
     return ans;
 }   

 int main(){
     //预处理
     memset(gender,0,sizeof(gender));
     cin>>n>>m;
     for(int i = 0;i<m;i++){
         int a,b;
         cin>>a>>b;
         if(a < 0){
             gender[-a] = 1;
         }
         if(b < 0){
             gender[-b] = 1;
         }
         relation[abs(a)].push_back(abs(b));
         relation[abs(b)].push_back(abs(a));
         hasPath[10000*abs(a)+abs(b)] = 1;
         hasPath[10000*abs(b)+abs(a)] = 1;
     }
     cin>>k;
     while (k--)
     {
         int A,B;
         cin>>A>>B;
         vector<pair<int,int> > res = solve(abs(A),abs(B));
         cout<<res.size()<<endl;
         for(int i = 0;i<res.size();i++){
             printf("%04d %04d\n",res[i].first,res[i].second);
         }
     }
     return 0;
 }

后来看了柳神的博客,发现主要的原因在于有一个0000和-0000这个陷阱在里面。所以不能够用int作为a、b两个参数的类型,必须要用string。
(这样相当于把自己原来的代码推翻重写了,但我觉得自己考试的时候一定想不到,这个点太坑了。。)

最后附上参考柳神修改后的代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<unordered_map>
#include<string>
#include<cstring>
using namespace std;
const int MAX_N = 10001;
vector<int> v[MAX_N];
unordered_map<int,bool> arr;
int n,m,k;
struct node
{
    int a,b;
};
bool cmp(node a,node b){
    return a.a != b.a ? a.a < b.a : a.b < b.b;
}
int main(){
    cin>>n>>m;
    for(int i = 0;i<m;i++){
        string a,b;
        cin>>a>>b;
        if(a.length() == b.length()){
            //记录同性朋友直接的关系
            v[abs(stoi(a))].push_back(abs(stoi(b)));
            v[abs(stoi(b))].push_back(abs(stoi(a)));
        }
        arr[10000*abs(stoi(a))+abs(stoi(b))] = arr[10000*abs(stoi(b))+abs(stoi(a))] = 1;

    }
    cin>>k;
    while (k--)
    {
        vector<node> ans;
        int a,b;cin>>a>>b;
        for(int i = 0;i<v[abs(a)].size();i++){
            for(int j = 0;j<v[abs(b)].size();j++){
                if(v[abs(a)][i] == abs(b) || v[abs(b)][j] == abs(a))continue;
                if(arr[v[abs(a)][i]*10000+v[abs(b)][j]] == 1){
                    ans.push_back(node{v[abs(a)][i],v[abs(b)][j]});
                }
            }
        }
        sort(ans.begin(),ans.end(),cmp);
        cout<<ans.size()<<endl;
        for(int i = 0;i<ans.size();i++){
            printf("%04d %04d\n",ans[i].a,ans[i].b);
        }
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值