*1076. Forwards on Weibo

来源:互联网 发布:大连淘宝美工学校 编辑:程序博客网 时间:2024/05/24 05:23

用C写真是吃力= =

#include <stdio.h>#include <stdlib.h>typedef struct EdgeNode {int UserID;struct EdgeNode* next;}EdgeNode,*PEdgeNode;typedef struct VNode {int UserID;PEdgeNode FirstForward;}VNode;typedef int Position;struct QNode {int *Data;     /* 存储元素的数组 */Position Front, Rear;  /* 队列的头、尾指针 */int MaxSize;           /* 队列最大容量 */};typedef struct QNode *Queue;int CntForwards(VNode Weibo[],int L,int S);void EnQueue(Queue Q, int X);int DeQueue(Queue Q);int IsEmpty(Queue Q);Queue CreateQueue(int MaxSize);int main(){VNode Weibo[1000];int N, L, i,FollowN,QueryNum,S,cnt,Follow;scanf("%d %d", &N, &L);for (i = 0; i < N; i++) {Weibo[i].UserID = i + 1;Weibo[i].FirstForward = NULL;}for (i = 0; i < N; i++) {scanf("%d", &FollowN);while (FollowN--) {PEdgeNode PtrForward = (PEdgeNode)malloc(sizeof(EdgeNode));scanf("%d", &Follow);PtrForward->UserID = i+1;PtrForward->next = Weibo[Follow-1].FirstForward;Weibo[Follow - 1].FirstForward = PtrForward;}}//for (PEdgeNode w = Weibo[4 - 1].FirstForward; w; w = w->next) /*要设visit【】*///printf("*%d*", w->UserID);scanf("%d", &QueryNum);while (QueryNum--) {scanf("%d", &S);cnt = CntForwards(Weibo, L,S);printf("%d\n", cnt);}return 0;}int CntForwards(VNode Weibo[], int L,int S){if (L == 0)return 0;int cnt = 1, v, level = 0, last =1,visited[1000],first=0;for (v = 0; v < 1000; v++)visited[v] = 0;Queue Q = CreateQueue(1000);PEdgeNode w;EnQueue(Q,S);visited[S-1] = 1;while (!IsEmpty(Q)) {v=DeQueue(Q);first++;for (w = Weibo[v - 1].FirstForward; w; w = w->next) {if (!visited[(w->UserID) - 1]) {visited[(w->UserID) - 1] = 1;EnQueue(Q, w->UserID);cnt++;}}if (first == last) {level++;last = cnt;}if (level == L)break;}free(Q);return cnt-1;}Queue CreateQueue(int MaxSize){Queue Q = (Queue)malloc(sizeof(struct QNode));Q->Data = (int *)malloc(MaxSize* sizeof(int));Q->Front = Q->Rear = 0;Q->MaxSize = MaxSize;return Q;}void EnQueue(Queue Q, int X){Q->Rear = (Q->Rear + 1) % Q->MaxSize;Q->Data[Q->Rear] = X;}int IsEmpty(Queue Q){return (Q->Front == Q->Rear);}int DeQueue(Queue Q){Q->Front = (Q->Front + 1) % Q->MaxSize;return  Q->Data[Q->Front];}


0 0
原创粉丝点击