1 条题解
-
0
解题思路
- 数据读取与存储:
- 先读取人数
n
,接着对每个人,读取其朋友列表并存储,同时记录朋友数量。 - 再读取垃圾邮件信息,包含发起者、两个阈值和三个属性,进行存储。
- 最后读取每个人的名字。
- 先读取人数
- 垃圾邮件传播模拟:
- 针对每封垃圾邮件,运用广度优先搜索(BFS)模拟传播过程。从发起者开始,将其朋友依次加入队列。
- 依据每个人转发的邮件数量(即朋友数量)和垃圾邮件的阈值,确定其获得的属性。
- 用标记数组记录哪些人已接收并转发过该邮件,未接收的人默认属性为第一个属性。
- 结果输出:按输入顺序输出每个人的名字和他们获得的属性。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<queue> using namespace std; struct node { char name[2000];//名字 int peng[1000];//朋友 char level[1000][200];//level[i][j]:第i个广告为第j种状态 int num;//朋友的数量 }; node p[250];//人 struct enen { int s;//广告的第一个发送人 int xx; int dd; char level[5][200]; }; enen adv[2500];//广告 int n; queue<int> que; int main() { int flag=0,kk; while(~scanf("%d",&n)) { if(n==0)flag=1; if(flag){scanf("%d",&kk);} if(n==0&&kk==0)break; int cnt; for(int i=1;i<=n;i++) { cnt=1; while(1) { int x; scanf("%d",&x); if(x==0) break; p[i].peng[cnt++]=x; } p[i].num=cnt-1; } cnt=1; while(1) { int x; scanf("%d",&x); if(x==0)break; adv[cnt].s=x; scanf("%d%d%s%s%s",&adv[cnt].xx,&adv[cnt].dd,adv[cnt].level[1],adv[cnt].level[2],adv[cnt].level[3]); cnt++; } for(int i=1;i<=n;i++) scanf("%s",p[i].name); int book[100]; for(int i=1;i<cnt;i++)//循环每个短信 { memset(book,0,sizeof(book));//标记数组 que.push(adv[i].s);//将起始人入队 while(que.size()) { int q=que.front(); if(book[q]==0)//该人没有发过当前短信 { for(int j=1;j<=p[q].num;j++) que.push(p[q].peng[j]);//将他的朋友入队 if(p[q].num<adv[i].xx)strcpy(p[q].level[i],adv[i].level[1]); else if(p[q].num>=adv[i].xx&&p[q].num<adv[i].dd)strcpy(p[q].level[i],adv[i].level[2]); else strcpy(p[q].level[i],adv[i].level[3]); book[q]=1;//标记 } que.pop(); } for(int j=1;j<=n;j++)//如果当前广告有人没接收到过 if(book[j]==0) strcpy(p[j].level[i],adv[i].level[1]); } for(int i=1;i<=n;i++) { printf("%s:",p[i].name); for(int j=1;j<cnt;j++) printf(" %s",p[i].level[j]); printf("\n"); } } return 0; }
- 数据读取与存储:
- 1
信息
- ID
- 296
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者