#include<iostream>
using namespace std;
int N,M;//N为顶点,M为边,有向图
typedef struct Gnode
{
int index;
struct Gnode*next;
}Gnode;
int main()
{
scanf("%d %d",&N,&M);
int i,j;
int **area=new int*[N];
int **area2=new int*[N];
bool *visited=new bool[N];
for(i=0;i<N;i++)
{
area[i]=new int[N];
area2[i]=new int[N];
visited[i]=false;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
area2[i][j]=0;
area[i][j]=0;
}
}
Gnode *G=new Gnode[N];
Gnode *G2=new Gnode[N];
int a,b;
for(i=0;i<N;i++)
{
G[i].index=i;
G[i].next=NULL;
G2[i].index=i;
G2[i].next=NULL;
}
for(i=0;i<M;i++)
{
scanf("%d %d",&a,&b);
area[a][b]=1;
Gnode *temp=&G[a];
while(temp->next!=NULL)
temp=temp->next;
Gnode *tempp=new Gnode;
tempp->index=b;
tempp->next=NULL;
temp->next=tempp;
}
for(i=0;i<N;i++)
{
Gnode *temp;
Gnode *start=G[i].next;
Gnode *start2=&G2[i];
while(start!=NULL)
{
int t=start->index;
Gnode *second=G[t].next;
while(second!=NULL)
{
if(!visited[second->index])
{
visited[second->index]=true;
temp=new Gnode;
temp->index=second->index;
temp->next=NULL;
while(start2->next!=NULL)
start2=start2->next;
start2->next=temp;
}
second=second->next;
}
start=start->next;
}
start2=G2[i].next;
while(start2!=NULL)
{
visited[start2->index]=false;
start2=start2->next;
}
}
printf("the adjacency list:\n");
for(i=0;i<N;i++)
{
printf("%d",G2[i].index);
Gnode *temp=G2[i].next;
while(temp!=NULL)
{
printf(" -> %d",temp->index);
temp=temp->next;
}
printf(" -> ^\n");
}
printf("\nthe adjacency matrix:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
for(int k=0;k<N;k++)
{
area2[i][j]+=area[i][k]*area[k][j];
}
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(area2[i][j]>0)
{
printf("1 ");
}
else
printf("0 ");
}
printf("\n");
}
return 0;
}
测试数据一:
6 9
0 1
0 2
0 3
2 3
2 4
2 5
3 4
5 4
1 3
测试数据二:
3 4
0 1
1 2
2 1
2 0
很显然 ,使用邻接表的时间复杂度是O(|V|+|E|),而使用邻接矩阵的时间复杂度是O(|V|^3)