PAT(甲级)2019年春季考试 7-3 Telefraud Detection
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2019年春季考试 7-3 Telefraud Detection相关的知识,希望对你有一定的参考价值。
1. 这题复杂在诈骗检测算法的理解
怎样的一个人会被判定成嫌疑犯呢?
他打出给别人的累计通话时长的不同的人数大于K
注意:不同和累计
怎样的两个人会被判定成同伙呢?
相互之间有通话记录
2. 同伙的合并我采用的并查集,在设置初始父节点时我很纠结,起始可以在合并之前,不管三七二十一的走一遍,把所有结点的父节点设置为自身。
3. 本题还用到了大量哈希存放信息
4. 输出的处理
第一次排序,以这些罪犯的源节点为下标,存进同一个结构体
再把结构体按照人数从大到小排序
第二次排序,把结构体的代表设置为优先队列的首元素
再按照代表从小到大排序
AC代码
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn = 1001;
int dura[maxn][maxn] = {0};
struct out{
int hashTable[maxn] = {0};
int num = 0;
};
struct in{
int hashTable[maxn] = {0};
int num = 0;
};
out oCall[maxn];
in iCall[maxn];
bool fri[maxn][maxn];//每个人的朋友,如果是嫌疑人那就是同伙
struct Gang{
int first = maxn;
priority_queue<int,vector<int>,greater<int> > Q;
};
Gang g[maxn];
int gNum = 0;
bool cmp(Gang a,Gang b){
return a.first<b.first;
}
bool cmp2(Gang a,Gang b){
return a.Q.size()>b.Q.size();
}
int K;
bool judge(int x){
int out = oCall[x].num;
int in = iCall[x].num;
if(out>K&&5*in<=out)return true;
else return false;
}
int F[maxn] = {0};
int findSource(int x){
int a = x;
while(x!=F[x]){
x = F[x];
}
while(a!=F[a]){
int z = a;
a = F[a];
F[z] = x;
}
return x;
}
void unite(int a,int b){
int sa = findSource(a);
int sb = findSource(b);
if(sa!=sb)F[sb] = sa;
}
int main(){
int N,M;
scanf("%d %d %d",&K,&N,&M);
int c,r,d;//caller receiver duration
while(M--){
scanf("%d %d %d",&c,&r,&d);
fri[c][r] = true;
dura[c][r] += d;
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(dura[i][j]>0){
if(oCall[i].hashTable[j]==0&&dura[i][j]<=5){
oCall[i].hashTable[j] = 1;
oCall[i].num ++;
}
if(oCall[j].hashTable[i]==1&&iCall[j].hashTable[i]==0){
iCall[j].hashTable[i] = 1;
iCall[j].num ++;
}
}
}
}
for(int i=1;i<=N;i++){
F[i] = i;
}
for(int i=1;i<=N;i++){
if(judge(i)==1){
for(int j=1;j<=N;j++){
if(fri[i][j]&&fri[j][i]&&judge(j)==1){
unite(i,j);
}
}
}
}
for(int i=1;i<=N;i++){
if(judge(i) == 1){
int sou = findSource(i);
g[sou].Q.push(i);
}
}
sort(g,g+maxn,cmp2);
for(int i=0;i<N;i++){
if(g[i].Q.size()!=0){
g[i].first = g[i].Q.top();
gNum ++;
}else break;
}
sort(g,g+maxn,cmp);
bool hasSus = false;
for(int i=0;i<gNum;i++){
int size = g[i].Q.size();
for(int j=0;j<size;j++){
hasSus = true;
printf("%d",g[i].Q.top());
g[i].Q.pop();
if(j!=size-1)printf(" ");
}
printf("\\n");
}
if(hasSus == false)printf("None\\n");
return 0;
}
以上是关于PAT(甲级)2019年春季考试 7-3 Telefraud Detection的主要内容,如果未能解决你的问题,请参考以下文章
PAT(甲级)2019年春季考试 7-2 Anniversary
PAT(甲级)2021年春季考试 7-3 Structure of Max-Heap
PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree