1. 程式人生 > >SDUTOJ3467 圖的基本儲存的基本方式四

SDUTOJ3467 圖的基本儲存的基本方式四

圖的基本儲存的基本方式四 (鄰接連結串列)

Time Limit: 2500 ms Memory Limit: 10000 KiB

Submit Statistic

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;
}