图的邻接矩阵&&邻接表表示及其相互转化
作者:
把头发掀起来看世界
,
2024-11-02 17:02:34
,
所有人可见
,
阅读 2
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=510,M=100010,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
struct Node
{
int id;//编号;
int w;//权值;
Node* next;
Node(int id,int w):id(id),w(w),next(NULL){}
}*head[N];
void add(int a,int b,int w)
{
Node* t=new Node(b,w);
t->next=head[a];
head[a]=t;
}
//邻接矩阵转邻接表
void convert1()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(g[i][j]<INF/2)
add(i,j,g[i][j]);
}
//邻接表转邻接矩阵
void convert2()
{
for(int i=1;i<=n;i++)
{
for(Node*p=head[i];p;p=p->next)
{
int j=p->id;
g[i][j]=g[j][i]=p->w;
}
}
}
//打印邻接矩阵
void print_A()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]>INF/2)
cout<<'-'<<' ';
else cout<<g[i][j]<<' ';
}
cout<<endl;
}
}
//打印邻接表
void print_link()
{
for(int i=1;i<=n;i++)
{
for(auto p=head[i];p;p=p->next)
printf("%d(%d) ",p->id,p->w);
cout<<endl;
}
}
int main()
{
memset(g,0x3f,sizeof g);
cin>>n>>m;
while(m--)
{
int a,b,w;
cin>>a>>b>>w;
/*//1.邻接矩阵构建
g[a][b]=g[b][a]=min(w,g[a][b]);*/
//2.邻接表构建
add(a,b,w);
add(b,a,w);
}
/*puts("邻接矩阵表示法:");
print_A();
convert1();
puts("邻接表表示法:");
print_link();*/
puts("邻接表表示法:");
print_link();
convert2();
puts("邻接矩阵表示法:");
print_A();
return 0;
}