1. 程式人生 > >hdu 4858 圖的模擬+vector 簡單題

hdu 4858 圖的模擬+vector 簡單題

專案管理

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2367    Accepted Submission(s): 899


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

題目大意:中文題目,給你點與點之間的關係,執行兩種操作,為1時給出結點的值增加相應的值,為0時查詢相鄰節點能量值之和。

解題思路:模擬題,直接模擬這個過程,用vector來儲存


[cpp] view plain copy print?
  1. //hdu 3823
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <string>
  6. #include <algorithm>
  7. #include <vector>
  8. usingnamespace std;  
  9. //http://blog.csdn.net/qinlumoyan/article/details/38466997
  10. typedeflong
    long ll;  
  11. constint maxn = 100000 + 5;  
  12. int node[maxn];//記錄每一個點的權值
  13. vector<int> map[maxn];//記錄每一個點的相鄰點
  14. int main()  
  15. {  
  16.     int t;  
  17.     scanf("%d", &t);  
  18.     int n, m;//頂點數和邊數
  19.     int a, b;//相連的邊
  20.     int oper;//操作次數
  21.     int cmd;//操作型別
  22.     int u, v;  
  23.     int ans;//答案、、權值數
  24.     while (t--)  
  25.     {  
  26.         memset(node, 0, sizeof
    (node));  
  27.         for (int i = 1; i <= maxn; i++) //清空vector
  28.             map[i].clear();  
  29.         scanf("%d%d", &n, &m);  
  30.         for (int i = 1; i <= m; i++)  
  31.         {  
  32.             scanf("%d%d", &a, &b);  
  33.             map[a].push_back(b);//無向圖,正反兩次操作
  34.             map[b].push_back(a);  
  35.         }  
  36.         scanf("%d", &oper);  
  37.         while (oper--)  
  38.         {  
  39.             scanf("%d", &cmd);  
  40.             if (!cmd)  
  41.             {  
  42.                 scanf("%d%d", &u, &v);  
  43.                 node[u] += v;  
  44.             }  
  45.             elseif (cmd==1)  
  46.             {  
  47.                 ans = 0;  
  48.                 scanf("%d", &u);  
  49.                 for (int i = 0; i < map[u].size(); i++)  
  50.                 {  
  51.                     ans += node[map[u][i]];  
  52.                 }  
  53.                 printf("%d\n", ans);  
  54.             }  
  55.         }  
  56.     }//t
  57.     system("pause");  
  58.     return 0;  
  59. }  
//hdu 3823
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
//http://blog.csdn.net/qinlumoyan/article/details/38466997
typedef long long ll;
const int maxn = 100000 + 5;

int node[maxn];//記錄每一個點的權值
vector<int> map[maxn];//記錄每一個點的相鄰點
int main()
{
	int t;
	scanf("%d", &t);
	int n, m;//頂點數和邊數
	int a, b;//相連的邊
	int oper;//操作次數
	int cmd;//操作型別
	int u, v;
	int ans;//答案、、權值數
	while (t--)
	{
		memset(node, 0, sizeof(node));
		for (int i = 1; i <= maxn; i++) //清空vector
			map[i].clear();
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= m; i++)
		{
			scanf("%d%d", &a, &b);
			map[a].push_back(b);//無向圖,正反兩次操作
			map[b].push_back(a);
		}
		scanf("%d", &oper);
		while (oper--)
		{
			scanf("%d", &cmd);
			if (!cmd)
			{
				scanf("%d%d", &u, &v);
				node[u] += v;
			}
			else if (cmd==1)
			{
				ans = 0;
				scanf("%d", &u);
				for (int i = 0; i < map[u].size(); i++)
				{
					ans += node[map[u][i]];
				}
				printf("%d\n", ans);
			}
		}
	}//t
	system("pause");
	return 0;
}