HDU 4858 项目管理 (简单图+暴力)

    xiaoxiao2021-03-25  76

    Problem Description

    我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!

    两个节点间可能有多条边,不过一条边的两端必然是不同的节点。

    每个节点都有一个能量值。

    现在我们要编写一个项目管理软件,这个软件呢有两个操作:

    1.给某个项目的能量值加上一个特定值。

    2.询问跟一个项目相邻的项目的能量值之和。(如果有多条边就算多次,比如a和b有2条边,那么询问a的时候b的权值算2次)。

    Input

    第一行一个整数T(1 <= T <= 3),表示测试数据的个数。

    然后对于每个测试数据,第一行有两个整数n(1 <= n <= 100000)和m(1 <= m <= n + 10),分别表示点数和边数。

    然后m行,每行两个数a和b,表示a和b之间有一条边。

    然后一个整数Q。

    然后Q行,每行第一个数cmd表示操作类型。如果cmd为0,那么接下来两个数u v表示给项目u的能量值加上v(0 <= v <= 100)。

    如果cmd为1,那么接下来一个数u表示询问u相邻的项目的能量值之和。

    所有点从1到n标号。

    Output

    对每个询问,输出一行表示答案。

    Sample Input

    1 3 2 1 2 1 3 6 0 1 15 0 3 4 1 1 1 3 0 2 33 1 2

    Sample Output

    4 15 15

    思路

    本来想到最暴力的方法一定会超时,然后写完试了一下居然过了,看来这道题的数据可能没有那种最极端的情况吧!

    做法就是先用邻接表建图,然后 cmd 为 0 的时候增加相应点的值,需要查询的时候遍历所有邻接点求和。

    AC 代码

    #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> using namespace std; #include<queue> #include<stack> vector<int>G[110000]; int cost[110000]; int main() { int T; scanf("%d",&T); while(T--) { int n,m,a,b,q,cmd,u,v; scanf("%d%d",&n,&m); memset(cost,0,sizeof(cost)); for(int i=1; i<=n; i++) G[i].clear(); for(int i=0; i<m; i++) { scanf("%d%d",&a,&b); G[a].push_back(b); //双向边 G[b].push_back(a); } scanf("%d",&q); for(int i=0; i<q; i++) { scanf("%d",&cmd); if(cmd==0) //增加权值 { scanf("%d%d",&u,&v); cost[u]+=v; } else //遍历求和 { int sum=0; scanf("%d",&v); int len=G[v].size(); for(int j=0; j<len; j++) sum+=cost[G[v][j]]; printf("%d\n",sum); } } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-36395.html

    最新回复(0)