图是由顶点和边(点与点之间的关系)组成的集合。大致分为有向图和无向图听名字就知道是什么了吧。如:
以该点为终点的边的数目和,称之为入度。以该点为起点的边的数目和称之为出度。度数等于入度+出度。从点a到点b有路径,我们称其为ab连通。若图中任意顶点之间都连通,则称该图为连通图。无向图中的极大连通子图,称之为连通分量。相当于有几个岛。我们称边的属性的大小为权,相当于道路的长短。这里只说两种图的储存结构。邻接表和邻接矩阵。都是用数组储存的。
邻接矩阵:若用a来记录一个图,a[i][j],等于0则i.j无连接,不等于0则有连接i.j(可以是权值也可以是一)。如
变成矩阵就是:
0 1 1 1 0
1 0 1 0 1
1 1 0 0 1
1 0 0 0 1
0 1 1 1 0
邻接表:准确的说是边的属性记录的集合。
typeof struct edge
{
int y,v,next; //y表示这条边的终点编号,v是权值;
}; //next表示同起点下条边的编号是多少
edge e[maxm+10]; //边表。
int link[maxn+10],t; //起点表 link[i]表示由i出去的第一条边的下标是多少
void insert(int ss,int ee,int vv)//ss为起点,ee为终点,vv为权值。
{
e[++t].y=ee;//t表示有t条边
e[t].v=vv;
e[t].next=link[ss];//同起点的下一条边的编号(现在是上一条边运算的时候倒过来就是下一条了)
link[ss]=t;//当前边的编号为t
}
void init()
{
int i,xx,yy,zz;;
scanf("%d%d %d",&n,&p,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&xx,&yy,&zz);//起点 终点 权
insert(xx,yy,zz);
insert(yy,xx,zz); //这里插入的是无向图,所以两条边都要插入。方向不同编号也不同
}
}
还有:
Struct edge
{
int x,y //起点和终点
int v //权值
} e[maxm];