SDUTOJ3467 圖的基本儲存的基本方式四
阿新 • • 發佈:2018-12-30
圖的基本儲存的基本方式四 (鄰接連結串列)
Time Limit: 2500 ms Memory Limit: 10000 KiB
Problem Description
解決圖論問題,首先就要思考用什麼樣的方式儲存圖。但是小鑫卻怎麼也弄不明白如何存圖才能有利於解決問題。你能幫他解決這個問題麼?
Input
多組輸入,到檔案結尾。
每一組第一行有一個數n表示n個點。接下來給出一個n*n的矩陣 表示一個由鄰接矩陣方式存的圖。
矩陣a中的元素aij如果為0表示i不可直接到j,1表示可直接到達。
之後有一個正整數q,表示詢問次數。
接下來q行每行有一個詢問,輸入兩個數為a,b。
注意:點的編號為0~n-1,2<=n<=5000,0<=q<=100,0 <= a,b < n。
保證可達邊的數量不超過1000
Output
對於每一條詢問,輸出一行。若a到b可以直接連通輸出Yes,否則輸出No。
Sample Input
2 0 1 0 0 2 0 1 1 0
Sample Output
Yes No
Hint
Source
LeiQ
思路:
gra[i] = j; 矩陣上的元素(i, j) 放在鄰接連結串列中 存在有向邊 gra[i]->data = j; 不存在 gra[i] = NULL;
#include <bits/stdc++.h> using namespace std; struct node { int data; // 存點的j node *next; }; int main() { ios::sync_with_stdio(false); node *p, *gra[5005]; int n, a, b, t; while (cin >> n) { for (int i = 0; i < n; i++) gra[i] = NULL; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a; if (a == 1) { if (gra[i] == NULL) { gra[i] = new node; gra[i]->data = j; gra[i]->next = NULL; } else { p = new node; p->next = gra[i]->next; p->data = j; gra[i]->next = p; } } } } cin >> t; while (t--) { cin >> a >> b; int flag = 0; p = gra[a]; while (p) { if (p->data == b) { flag = 1; break; } p = p->next; } if (flag) cout << "Yes" << endl; else cout << "No" << endl; // if (gra[a] == NULL) // cout << "No" << endl; // else // { // p = gra[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; }