我的代码大体上与网络上的思路一致
只是想多使用stl简化代码。。
但是久走夜路终闯鬼了
最后一个点超时了
原因是我不能用unordered_map
unordered_map在使用pair时会报错,Stack Overflow上说好像是hash冲突
得换上邻接表或者使用10000*a+b这样的bool数组才行
也就是得大改代码。。
气傻了
不改了
下面是错了一个点的简洁代码
看来通过甲级经验也很重要。
希望对大家有所帮助
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
map< pair<string,bool> , vector<pair<string,bool> > > mp;
string a,b;
priority_queue<pair<string,string> ,vector<pair<string,string> > ,greater<pair<string,string> > > q;
pair<string ,int> pair_make(string a){
if(a[0]=='-'){
string b("aaaa");
for(int i=1;i<=4;i++) b[i-1]=a[i];
return make_pair(b,true);
}
else return make_pair(a,false);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++) {
cin>>a>>b;
pair<string,bool> pair1=pair_make(a);
pair<string,bool> pair2=pair_make(b);
mp[pair1].push_back(pair2);
mp[pair2].push_back(pair1);
}
cin>>k;
for(int i=1;i<=k;i++){
cin>>a>>b;
pair<string,bool> A=pair_make(a);
pair<string,bool> B=pair_make(b);
if(mp.count(A) == 0 || mp.count(B) == 0){
cout << 0 << endl;
continue;
}
if(mp.count(A) != 0) for(auto j=mp[A].begin(); j != mp[A].end(); j++){
if(mp.count(*j) != 0) if(*j != B && *j != A && j->second==A.second) for(auto o=mp[*j].begin(); o != mp[*j].end(); o++){
if(mp.count(*o) != 0) if(*o != B && *o != A && o->second==B.second) for(auto l=mp[*o].begin(); l != mp[*o].end(); l++)
if(l->first==B.first) q.push(make_pair(j->first,o->first));
}
}
if(q.empty()) {
cout << 0 << endl;
continue;
}
cout<<q.size()<<endl;
while(!q.empty()) cout<<q.top().first<<" "<<q.top().second<<endl,q.pop();
}
}