1. 程式人生 > >DS圖—圖的鄰接矩陣儲存及度計算

DS圖—圖的鄰接矩陣儲存及度計算

題目描述

假設圖用鄰接矩陣儲存。輸入圖的頂點資訊和邊資訊,完成鄰接矩陣的設定,並計算各頂點的入度、出度和度,並輸出圖中的孤立點(度為0的頂點)

--程式要求--

若使用C++只能include一個頭檔案iostream;若使用C語言只能include一個頭檔案stdio

程式中若include多過一個頭檔案,不看程式碼,作0分處理

不允許使用第三方物件或函式實現本題的要求

輸入

測試次數T,每組測試資料格式如下:

圖型別  頂點數 (D—有向圖,U—無向圖)

頂點資訊

邊數

每行一條邊(頂點1 頂點2)或弧(弧尾 弧頭)資訊

輸出

每組測試資料輸出如下資訊(具體輸出格式見樣例):

圖的鄰接矩陣

按頂點資訊輸出各頂點的度(無向圖)或各頂點的出度  入度  度(有向圖)。孤立點的度資訊不輸出。

圖的孤立點。若沒有孤立點,不輸出任何資訊。

樣例輸入

2

D 5

V1 V2 V3 V4 V5

7

V1 V2

V1 V4

V2 V3

V3 V1

V3 V5

V4 V3

V4 V5

U 5

A B C D E

5

A B

A C

B D

D C

A D

樣例輸出

0 1 0 1 0

0 0 1 0 0

1 0 0 0 1

0 0 1 0 1

0 0 0 0 0

V1: 2 1 3

V2: 1 1 2

V3: 2 2 4

V4: 2 1 3

V5: 0 2 2

0 1 1 1 0

1 0 0 1 0

1 0 0 1 0

1 1 1 0 0

0 0 0 0 0

A: 3

B: 2

C: 2

D: 3

E

#include<iostream>
#include<cstring>
using namespace std;
 
int find(string str[], string st, int n){
    for(int i= 0; i< n; i++)
      if(str[i]== st)
       return i;
}
int main(){
    int t;
    cin>>t;
     
    while(t--){
        string ch;
        int n;
        cin>>ch>>n;
         
        string str[200];
        for(int i= 0; i< n; i++)
           cin>>str[i];
            
 
        int array[n+ 5][n+5];
         
        for(int i= 0; i< n+ 5; i++)
          for(int j= 0 ; j< n+ 5; j++)
            array[i][j]= 0;
             
        int in;
        cin>>in;
         
        for(int i= 0 ; i< in; i++){
            string s1; 
            string s2;
            cin>>s1>>s2;
             
            int a= find(str, s1, n);
            int b= find(str, s2, n);
            //cout<<a<<" "<<b<<"_____"<<endl;
            array[a][b]= 1;
            if(ch== "U")
            array[b][a]= 1;
        }
         
        for(int i= 0; i< n; i++){
          for(int j= 0; j< n; j++){
            cout<<array[i][j];    
            if(j!= n- 1)
             cout<<" ";       
          }
 
            cout<<endl;
        }
         
 
        for(int i= 0; i< n; i++){
            cout<<str[i];
             int inn= 0;
             int outt= 0;
                         
            for(int j= 0; j< n; j++){
                if(array[i][j])
                  outt++;
            }
            for(int j= 0; j< n; j++){
                if(array[j][i])
                  inn++;
            }
             
            if(ch== "U"){
                if(inn+ outt){
                    cout<<": "<<(inn+outt)/ 2<<endl;
                }
                 
            }
            else if(ch== "D"){
                if(inn+ outt)
                cout<<": "<<outt<<" "<<inn<<" "<<inn+ outt<<endl;
            }
        }
 
    }
     
    return 0;
}