AcWing 4270. 电信诈骗检测
原题链接
简单
作者:
YAX_AC
,
2024-12-09 19:41:05
,
所有人可见
,
阅读 3
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 1010;
int n,m,k;
int g[N][N];
int st[N];
int p[N];
vector<int> suspect;
//more than 超过
int f(int x)//判断x是否是嫌疑人
{
int phone = 0,reback = 0;
for(int i = 1; i<=n; i++)
{
if(g[x][i] == 0) continue;//没有通话
if(g[x][i] <= 5)
{
phone++;
if(g[i][x]) reback++;
}
}
return phone > k && phone >= reback*5;
}
int find(int x)
{
if(p[x]!=x) p[x] = find(p[x]);
return p[x];
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>k>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
g[a][b] += c;
}
for(int i = 1; i<=n; i++)
if(f(i)) suspect.push_back(i);
if(suspect.empty())
{
cout<<"None";
return 0;
}
for(int i = 1; i<=n; i++) p[i] = i;
//从所有嫌疑人中找出同伙
//讲同伙连在同一条树上
for(int i = 0; i<(int)suspect.size(); i++)
{
for(int j = i+1; j<(int)suspect.size(); j++)
{
int a = find(suspect[i]), b = find(suspect[j]);
if(g[suspect[i]][suspect[j]] && g[suspect[j]][suspect[i]])
p[a] = b;//连一起
}
}
//输出,每个团伙
for(int i = 0; i<(int)suspect.size(); i++)
{
int t = suspect[i];
if(st[t]) continue;
cout<<t;
st[t] = true;//标记该嫌疑人已经被遍历过了
for(int j = i+1; j<(int)suspect.size(); j++)
{
if(find(t) == find(suspect[j]) && !st[suspect[j]])//如果剩下嫌疑人是同伙
{
st[suspect[j]] = true;
cout<<' '<<suspect[j];
}
}
cout<<endl;
}
return 0;
}