目的:找出能帮两个人做第一次联系的朋友
输入:
N (1,300] 总人数
M 关系对,边
M条关系对。每个人有4位数字代替。负数是女孩
K <=100 查询数
K对男女,第一个人爱上了第二个人
输出:
对于每个查询,输出不同的朋友对数,可以帮助他们的朋友对数,然后在每一行输出朋友对ID。
如果A,B是相反的性别。先输出于A相同性别的A的朋友,在输出于B相同性别B的朋友。如果AB性别相同。输出和他们性别相同的朋友。
按照非减输出第一个id。然后非减少输出第二个id。
算法:
先把边按照男生女生分开存,由于id是四位正负都有的数字,所以存边不用矩阵,用链表。然后深度优先搜索。找到一条路径就比对是否满足条件,然后把它存进vector向量。开始用map存边。
#include<iostream>
#include<stdio.h>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int b,c;
};
map<int,bool> h;
vector<int> frnd[10000];
int n,m,k;
bool cmp(node a,node d)
{
if(a.b!=d.b)
{
return a.b<d.b;
}else
{
return a.c<d.c;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
string left,right;
cin>>left>>right;
if(left.size()==right.size())
{
frnd[abs(stoi(left))].push_back(abs(stoi(right)));
frnd[abs(stoi(right))].push_back(abs(stoi(left)));
}
h[abs(stoi(right))*10000+abs(stoi(left))]= h[abs(stoi(left))*10000+abs(stoi(right))] = true;
}
scanf("%d",&k);
for(int i=0;i<k;i++)
{
int a,d;
cin>>a>>d;
vector<node> ans;
for(int j=0;j<frnd[abs(a)].size();j++)
{
for(int l=0;l<frnd[abs(d)].size();l++)
{
if(frnd[abs(a)][j]==abs(d)||frnd[abs(d)][l]==abs(a)) continue;
if(h[frnd[abs(a)][j]*10000+frnd[abs(d)][l]]==true)
{
ans.push_back(node{frnd[abs(a)][j],frnd[abs(d)][l]});
}
}
}
printf("%d\n",ans.size());
sort(ans.begin(),ans.end(),cmp);
for(int j=0;j<ans.size();j++)
{
printf("%04d %04d\n",ans[j].b,ans[j].c);
}
}
return 0;
}
反思:在家休息了十天,智力水平倒退回3岁水平。