鄰接表到鄰接矩陣
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);
}