1,题目
2,本题答案
- 本题思路比较简单,就不列了,分析代码即可。
3,代码
#include<stdio.h>
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int N,M;
vector<string> edges[350];
int num_edges=0;
map<string,int> vertex_edges;
struct Node {
string first,second;
};
bool cmp(const Node &a,const Node &b) {
if(a.first!=b.first)
return a.first<b.first;
return a.second<b.second;
}
vector<Node> pairs_friends;
string A,B;
int main() {
scanf("%d %d",&N,&M);
string p1,p2;
for(int i=0; i<M; ++i) {
cin>>p1>>p2;
if(vertex_edges.find(p1)!=vertex_edges.end()) {
edges[vertex_edges[p1]].push_back(p2);
} else {
vertex_edges[p1]=num_edges;
edges[num_edges++].push_back(p2);
}
if(vertex_edges.find(p2)!=vertex_edges.end()) {
edges[vertex_edges[p2]].push_back(p1);
} else {
vertex_edges[p2]=num_edges;
edges[num_edges++].push_back(p1);
}
}
int K;
scanf("%d",&K);
for(int i=0; i<K; ++i) {
cin>>A>>B;
pairs_friends.clear();
if(vertex_edges.find(A)!=vertex_edges.end()) {
int posa=vertex_edges[A];
int lena=edges[posa].size();
for(int i=0; i<lena; ++i) {
string first=edges[posa][i];
if(first==B)
continue;
if((A[0]=='-'&&first[0]=='-')||(A[0]!='-'&&first[0]!='-')) {
int posb=vertex_edges[B];
int lenb=edges[posb].size();
for(int j=0; j<lenb; ++j) {
string second=edges[posb][j];
if(second==A||second==first)
continue;
if((B[0]=='-'&&second[0]=='-')||(B[0]!='-'&&second[0]!='-')) {
int posfirst=vertex_edges[first];
if(find(edges[posfirst].begin(),edges[posfirst].end(),second)!=edges[posfirst].end()) {
Node tem;
if(first[0]=='-') tem.first=first.substr(1,4);
else tem.first=first;
if(second[0]=='-') tem.second=second.substr(1,4);
else tem.second=second;
pairs_friends.push_back(tem);
}
}
}
}
}
} else {
printf("0\n");
continue;
}
sort(pairs_friends.begin(),pairs_friends.end(),cmp);
int len=pairs_friends.size();
printf("%d\n",len);
for(int i=0; i<len; ++i) {
printf("%s %s\n",pairs_friends[i].first.c_str(),pairs_friends[i].second.c_str());
}
}
return 0;
}
4,这篇文章的重点
- 先给出结论
1,对于输入:不管c++的cin还是c的scanf,在c++没有关闭同步情况下,速度差不多。并且,c++关闭同步的情况应当是适用于有大量的连续数据输入的情况。
并且还要注意,对于代码存在string(多用于map<string,typename)的情况,最好用cin输入,scanf输入会出现错误,原因暂时不知,知道望指教哈。
另外,cin输入的时间不稳定,波动有30ms左右,对于时间敏感的题目容易出错。而scanf输入数据的时间消耗较为稳定。因此,输入数据,不适用关闭cin同步的情况下,用scanf较好,有string,必须使用cin。
2,对于输出:特别指出,对于string的输出,cout和printf差距很大,**cout慢很多!**因此,需要输出string时,尽量转化为char[]用printf进行输出。 - 结论
有string,用cin输入,其他情况用scanf稳定。
输出尽量用printf,有string,必须用printf输出。
5,测试
- 使用cout输出string的情况
for(int i=0; i<len; ++i) {
cout<<pairs_friends[i].first<<" "<<pairs_friends[i].second<<endl;
}
- 耗时
三次提交结果,除了第一次侥幸外,最后一个点都超时。 - 使用printf输出string:
for(int i=0; i<len; ++i) {
printf("%s %s\n",pairs_friends[i].first.c_str(),pairs_friends[i].second.c_str());
}
- 耗时:
- 可见3次无一列外都通过了,并且差不多在227ms左右。