西南科技大學OJ題 鄰接表到鄰接矩陣1056

鄰接表到鄰接矩陣

 5000(ms)

 10000(kb)

 2329 / 7285

假設無向圖G採用鄰接表存儲,編寫一個算法輸出鄰接矩陣。

輸入

第一行爲一個整數n,表示頂點的個數(頂點編號爲0到n-1)。第二行表示頂點0可直接到達的頂點編號,其他行定義相同。

輸出

輸出圖G的鄰接矩陣。整數矩陣大小爲n*n,表示圖的鄰接關係。數字爲0表示不鄰接,1表示鄰接。

樣例輸入

5
1 3 4
0 2 3
1 3 4
0 1 2 4
0 2 3

樣例輸出

01011
10110
01011
11101
10110

 

 

 

#include<stdio.h>
#include<malloc.h>
struct ArcNode//儲存數據以及下一個結點的結構體 
{
    int data;
    ArcNode *next;
};
struct HeadNode//儲存頭結點的結構體 
{
    ArcNode *head;
};
void CreateAdj(int n,HeadNode VNode[])//創建鄰接表 
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            int data;char a;
            scanf("%d%c",&data,&a);//a用來儲存空格,或者回車,用來做判斷依據 
            ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode));
              p->data=data;
              p->next=NULL;
              if(VNode[i].head==NULL) VNode[i].head=p;
              else
              {
                  ArcNode *q=VNode[i].head;
                while(q->next!=NULL) q=q->next;
                  q->next=p;
            }
            if(a=='\n') break;//如果a爲回車了,則表示此序號的鄰接鏈表儲存依據結束了,跳出循環,進行下一行的儲存 
        }
    }
}
void MatGraph(int n,int edges[100][100],HeadNode VNode[])//轉換鏈表爲矩陣 
{
    for(int i=0;i<n;i++)
    {
        if(VNode[i].head!=NULL)
        {
            ArcNode *p=VNode[i].head;
            while(p!=NULL)
            {
                edges[i][p->data]=1;
                p=p->next;
            }
        }
    }
}
void DispAdj(int edges[100][100],int n)//輸出矩陣 
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++) printf("%d",edges[i][j]);
        printf("\n");    
    } 
}
int main()
{
    int n;int edges[100][100]={0};//初始化鄰接矩陣 
    scanf("%d",&n);
    HeadNode VNode[n];
    for(int i=0;i<n;i++) VNode[i].head=NULL;//初始化鄰接表 
    CreateAdj(n,VNode);
    MatGraph(n,edges,VNode);
    DispAdj(edges,n);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章