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

PAT(甲级)2017年春季考试

PAT(甲级)2019年秋季考试 7-3 Postfix Expression

PAT(甲级)2020年春季考试 7-2 The Judger