SWUST OJ1056
邻接表到邻接矩阵 5000(ms) 10000(kb) 2466 / 7639假设无向图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);
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;
}
}
}
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);
}