题目:消息在人群中中的传播,给定一个传递关系,每个消息传播需要一天。
给出不同的消息出发点,问同时最多有多少人在传播消息,那最早是第几天。
分析:最短路,搜索。利用bfs算法计算出每个人接收消息的时间,利用时间计数,统计查询。
注意:有向图,边不是双向的;memset在string.h文件中。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
int friends[2505][16];
int dist[2505];
int visited[2505];
int counter[2505];
int queue[2505];
int employe[65];
//邻接表
typedef struct nodee {
int point;
nodee* next;
}enode;
enode *head[2505];
enode node[40005];
int e_size;
void add( int a, int b )
{
node[e_size].point = b;
node[e_size].next = head[a];
head[a] = &node[e_size ++];
}
//end 邻接表
void bfs( int s, int n )
{
for ( int i = 0 ; i < n ; ++ i ) {
visited[i] = 0;
counter[i] = 0;
dist[i] = 2505;
}
int move = 0,save = 0;
queue[save ++] = s;
visited[s] = 1;
dist[s] = 0;
while ( move < save ) {
int now = queue[move ++];
for ( enode* p = head[now] ; p ; p = p->next )
if ( !visited[p->point] && dist[p->point] > dist[now] + 1 ) {
dist[p->point] = dist[now] + 1;
visited[p->point] = 1;
queue[save ++] = p->point;
}
}
for ( int i = 0 ; i < n ; ++ i )
counter[dist[i]] ++;
int max = 0,space = 0;
for ( int i = 1 ; i < n ; ++ i )
if ( counter[i] > max ) {
max = counter[i];
space = i;
}
if ( max )
printf("%d %d\n",max,space);
else printf("0\n");
}
int main()
{
int E,N,T;
while ( scanf("%d",&E) != EOF ) {
for ( int i = 0 ; i < E ; ++ i ) {
scanf("%d",&friends[i][0]);
for ( int j = 1 ; j <= friends[i][0] ; ++ j )
scanf("%d",&friends[i][j]);
}
//建图
e_size = 0;
memset( head, 0, sizeof(head) );
memset( node, 0, sizeof(node) );
for ( int i = 0 ; i < E ; ++ i )
for ( int j = 1 ; j <= friends[i][0] ; ++ j )
add( i, friends[i][j] );
scanf("%d",&T);
for ( int i = 0 ; i < T ; ++ i ) {
scanf("%d",&employe[i]);
bfs( employe[i], E );
}
}
return 0;
}