图的储存方式
1.邻接矩阵
创建一个二维数组V,将点作为下标,数组值代表这条边的权重。
2.数组存边
struct Edge
{
int value;//边的权
int to;//边的终点
int from;//边的起点
}edge[500005];
//存边
for(int i=0;i<m;i++)
{
cin>>u>>v>>w;
edge[i].from=u;
edge[i].to=v;
edge[i].value=w;
}
3.邻接表
vector<int> a[500005];
//存边
for(int i=0;i<m;i++)
{
cin>>u>>v;//u点与v点是连通的
a[u].push_back(v);//a[i]存的为与i点相连的点,但一般不存边权
}
//遍历
for(int i=0;i<=n;i++)//遍历起点
for(int j=0;j<a[i].size();j++)//遍历和i相连的点
cout<<"起点:"<<i<<"终点:"<<a[i][j]<<endl;
4.链式向前星
struct Edge
{
int next;//下个同起点的边的在edge数组里的下标
int value;//当前边的边权
int to;//这条边的终点
}edge[500005];
int first_edge[500005];//first_edge[i]存的是以i为起点的第一个边在edge数组里的下标
//存边
void add(int u,int v,int val,int i)
{
edge[i].to=v;//记录这条边的终点
edge[i].value=val;//边权
edge[i].next=first_edge[u];//下条同起点的边的下标为原先的第一条边的下标
first_edge[u]=i;//新的第一条边更新
}
//遍历
for(int j=1;j<=n;j++)//遍历所有起点[1,n]
for(int i=first_edge[j];i!=0;i=edge[i].next)//遍历起点为j的所有边
cout<<"起点:"<<j<<"终点:"<<edge[i].to<<"边权:"<<edge[i].value<<endl;