PAT1139


有两个点没过T~~T


#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <set>
#include <cmath>
#include <string>
using namespace std;
struct friends {
int fa;
int fb;

bool operator<(const struct friends & f) const {
if (abs(fa) < abs(f.fa)) {
return true;
} else if (abs(fa) == abs(f.fa)) {
if (abs(fb) < abs(f.fb)) 
return true;
else
return false;
} else
return false;
}
}; 
constexpr int K=100;
set<struct friends> vv[K];


map <int, vector<int> > mapv;
void doIt (map<int, vector<int> > mapv, int n1, int n2, set<struct friends> &vv);


void getInteger(string str, int &nn) {
int len=str.length();
int sym=0, i=0;
if (str[0] == '-') {
sym=1;
i=1;
}

nn=0;
while (i < len) {
nn = nn*10+str[i]-'0';
i++;
}

if (nn != 0) {
if (sym == 1) {
nn=-nn;
}
} else {
if (sym == 1)
nn=-5678;
else
nn=5678;
}

}


int main () {
int n, m;
scanf ("%d %d", &n, &m);
int i=0;
int t1, t2;
string str1, str2; 
while (i < m) {
cin >> str1 >> str2;
//scanf ("%d %d", &t1, &t2);
getInteger(str1, t1);
getInteger(str2, t2);
mapv[t1].push_back(t2);
mapv[t2].push_back(t1);
i++;
}

int k;
scanf ("%d", &k);
i=0;
while (i < k) {
//scanf ("%d %d", &t1, &t2);
cin >> str1 >> str2;
getInteger (str1, t1);
getInteger (str2, t2);


doIt (mapv, t1, t2, vv[i]);
i++;
}

i=0;
while (i < k) {
printf ("%d\n", vv[i].size());
for (auto iter=vv[i].begin(); iter!=vv[i].end(); iter++) {
printf ("%04d %04d\n", iter->fa, iter->fb);
}
i++;
}
return 0;
}


void doIt (map<int, vector<int> > mapv, int n1, int n2, set<struct friends> &vv) {
vector<int> vv1=mapv[n1];
vector<int> vv2=mapv[n2];

if (n1 == n2) {
return;

for (auto iter1=vv1.begin(); iter1!= vv1.end(); iter1++) {
if (n1>0 && *iter1<0 )
continue;
if (n1<0 && *iter1>0)
continue;
if (*iter1 == n2) 
continue;
//if (find (vv2.begin(), vv2.end(), *iter1) != vv2.end())
// continue;
vector<int> vvv=mapv[*iter1];
for (auto iter2=vv2.begin(); iter2!=vv2.end(); iter2++) {
if (n2>0 && *iter2<0)
continue;
if (n2<0 && *iter2>0)
continue;
if (*iter2 == n1)  
continue;
if (find (vvv.begin(), vvv.end(), *iter2) != vvv.end()) {
struct friends tff;
tff.fa=abs(*iter1);
tff.fb=abs(*iter2);
vv.insert(tff);
}
}
}

}



修改一下就过了:

后面的输出忘记把零转换回来了。。

while (i < k) {
printf ("%d\n", vv[i].size());
for (auto iter=vv[i].begin(); iter!=vv[i].end(); iter++) {
int tta, ttb;
tta=iter->fa;
ttb=iter->fb;
if (tta != 5678 && tta != -5678) {
printf ("%04d", tta);
} else {
printf ("0000");
}
if (ttb != 5678 && ttb != -5678) {
printf (" %04d\n", ttb);
} else {
printf (" 0000\n");
}
//printf ("%04d %04d\n", iter->fa, iter->fb);
}
i++;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值