题目再现
题目内容:
给定一个节点有权重的图,
请你计算与一个节点相邻的所有节点的权重和。
节点编号为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