SDUTOJ3117 圖的基本儲存的基本方式二
阿新 • • 發佈:2018-12-30
圖的基本儲存的基本方式二
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
解決圖論問題,首先就要思考用什麼樣的方式儲存圖。但是小鑫卻怎麼也弄不明白如何存圖才能有利於解決問題。你能幫他解決這個問題麼?
Input
多組輸入,到檔案結尾。
每一組第一行有兩個數n、m表示n個點,m條有向邊。接下來有m行,每行兩個數u、v代表u到v有一條有向邊。第m+2行有一個數q代表詢問次數,接下來q行每行有一個詢問,輸入兩個數為a,b。
注意:點的編號為0~n-1,2<=n<=500000 ,0<=m<=500000,0<=q<=500000,a!=b,輸入保證沒有自環和重邊
Output
對於每一條詢問,輸出一行。若a到b可以直接連通輸出Yes,否則輸出No。
Sample Input
2 1
0 1
2
0 1
1 0
Sample Output
Yes
No
Hint
Source
lin
以鄰接連結串列的方式構建圖
/*基於鄰接連結串列*/ #include <bits/stdc++.h> using namespace std; struct node { int data; node *next; }; int main() { ios::sync_with_stdio(false); node *p, *q, *book[500001]; int a, b, n, m, t; while (cin >> n >> m) { // memset(book, NULL, sizeof(book)); for (int i = 0; i < n; i++) book[i] = NULL; // 構建鄰接連結串列 for (int i = 0; i < m; i++) { cin >> a >> b; if (book[a] == NULL) { book[a] = new node; book[a]->data = b; book[a]->next = NULL; } else { q = book[a]->next; p = new node; p->data = b; p->next = q; book[a]->next = p; } } cin >> t; while (t--) { cin >> a >> b; int flag = 0; if (book[a] == NULL) cout << "No" << endl; else { p = book[a]; while (p) { if (p->data == b) { flag = 1; break; } p = p->next; } if (flag == 1) cout << "Yes" << endl; else cout << "No" << endl; } } } return 0; }