题目再现
题目内容:
给定一个节点有权重的图,
请你计算与一个节点相邻的所有节点的权重和。
节点编号为1~N。
每个节点的编号即为他的权重。输入格式:
只有一组测资。
第一行有三个数字,N、M、Q。
N表示这张图有多少节点,
M表示这张图有多少边,
Q表示会有多少个询问。
之后M行,每行有两个数字a、b,
代表a与b是相邻的。
之后Q行,每行有一个数字x,
代表询问的点编号。
给定的编不会重复,
而且不会有自己和自己相连的情况。
测资范围:
0 < N < 1000
0 < M < 20000
0 < Q < 2000输出格式:
对于每一个询问,计算与该节点相邻的所以节点权重和。
将所有询问的答案加总后再输出。输入样例:
10 8 2
1 2
1 3
2 5
2 6
3 8
10 9
8 6
3 5
1
3输出样例:
19
算法实现
这个题是一个图的操作,可以使用邻接矩阵和邻接表来实现,根据题意,这里选择用邻接表来实现。
#include <stdio.h>
#include <stdlib.h>typedef struct EdgeNode{int adjvex;struct EdgeNode *next;
}EdgeNode;typedef struct VertexNode{struct EdgeNode *next;
}VertexNode;int main(){int N, M, Q;int a, b, i, z;EdgeNode *edgA, *edgB, *edgTmp;long long sum = 0;scanf("%d %d %d", &N, &M, &Q);VertexNode VertexList[N];for(i = 0; i < N; i++){VertexList[i].next = NULL;}while(M --){scanf("%d %d", &a, &b);edgA = (EdgeNode *)malloc(sizeof(EdgeNode));edgB = (EdgeNode *)malloc(sizeof(EdgeNode));edgA->next = VertexList[b].next;edgB->next = VertexList[a].next;edgA->adjvex = a;edgB->adjvex = b;VertexList[a].next = edgB;VertexList[b].next = edgA;}while(Q --){scanf("%d", &z);edgTmp = VertexList[z].next;while(edgTmp){sum += edgTmp->adjvex;edgTmp = edgTmp->next;}}printf("%lld", sum);return 0;
}
博客名称:王乐平博客
博客地址:http://blog.lepingde.com
CSDN博客地址:http://blog.csdn.net/lecepin