问题描述:图论,给定一些通话记录,判断一个人是否是嫌疑人,以及该嫌疑人所属团伙。
解题思路:首先读入通话记录,然后根据条件判断是否是嫌疑人,然后将嫌疑人排序,便于输出。然后再判断那些嫌疑人是相互连接的。然后输出。
AC代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
#define MAX 1005
#define INF 14400
int tu[MAX][MAX],K,M,N;
bool vis[MAX]={0};
vector<int>out;
set<int>gan;
void visit(int v)
{
vis[v]=1;gan.insert(v);
for(int i=0;i<out.size();++i){
if(vis[out[i]]==0&&tu[v][out[i]]<INF&&tu[out[i]][v]<INF)visit(out[i]);
}
}
int main()
{
//freopen("test.txt","r",stdin);
scanf("%d%d%d",&K,&N,&M);
int c,r,d;
for(int i=1;i<=N;++i){
for(int j=1;j<=N;++j){
tu[i][j]=INF;
}
}
while(M--){
scanf("%d%d%d",&c,&r,&d);
if(tu[c][r]==INF)tu[c][r]=d;
else tu[c][r]+=d;
}
for(int i=1;i<=N;++i){
int cnt=0,x=0;
for(int j=1;j<=N;++j){
if(tu[i][j]<=5){
++cnt;
if(tu[j][i]!=INF)++x;
}
}
if(cnt>K&&x<=cnt/5)out.push_back(i);
}
if(out.size()==0){
printf("None");
return 0;
}
sort(out.begin(),out.end());
//for(int i=0;i<out.size();++i)printf("%d ",out[i]);printf("\n");
for(int i=0;i<out.size();++i){
if(!vis[out[i]]){
gan.clear();
visit(out[i]);
set<int>::iterator it=gan.begin();
while(it!=gan.end()){
if(it!=gan.begin())printf(" ");
printf("%d",*it);
++it;
}
printf("\n");
}
}
return 0;
}