| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 luciferzf 于 2017-8-15 14:03 编辑  
 
图: 
1)图是由点的集合和边的集合组成的一个多对多的关系,通常可以表示为G(V,E),其中V是点的集合,E是边的集合,点的集合要求有穷非空 
2)简单图:图中不存在顶点到自身的边,并且两个点之间只有一条边 
3)无向完全图:任意2个顶点间都存在无向边 
4)有向完全图:任意2个顶点间都存在两条方向相反的有向边 
5)连通图:图中任意两个点都连通;强连通图则要求任意两个点都存在路径 
 
图的存储结构: 
1)我们定义一个一维数组存放顶点,一个二维数组存放边,对于二维数组元素T[a][b]表示点a和b的关系,若T[a][b]值为1,表示a和b之间有边,若为0,则无边  
2)对于无向图,边的储存数组相当于一个对称矩阵,一个顶点的度等于该顶点在矩阵中对应行的1的个数 
3)对于网,储存边的数组中的值不再只是0和1,而是每条边的权,若两个点间不存在边,则定义数组对应元素的值为无穷大(即一个比其他元素值都大的静态值) 
 
邻接表: 
首先定义一个顺序表用来存储各个节点,然后利用链表的形式,将各个相邻点在顺序表中的下标依次连接在顺序表里各个点上。对于有向表来说,这样就易于得到点的出度。 
十字链表:相比于邻接表,十字链表将出度和入度分开,十字链表的顺序表中的各个点不仅储存了出度的点的下标,还有入度的点的下标,对于有向图,更易于得到入度和出度。 
邻接多重表:在边表结构中,我们储存了一条边的两个点的下标,以及分别指向与两个点相邻的另外两条边的指针 
 
- #include<cstdio>
 
 - #include<cstdlib>
 
 - #include<iostream>
 
 - using namespace std;
 
 - #define N 100
 
  
- class edgenode
 
 - {
 
 - public:
 
 -         int index;
 
 -         edgenode *np=NULL;
 
  
- };
 
  
- class node
 
 - {
 
 - public:
 
 -         char data;
 
 -         int flag = 0;
 
 -         edgenode *np=NULL;
 
 - }vertex[N];
 
  
 
- void Input()
 
 - {
 
 -         int T;
 
 -         cout << "Input vertex:";
 
 -         cin >> T;
 
 -         vertex[0].data = T;
 
 -         for (int i = 1; i < T+1; i++)
 
 -         {
 
 -                 cin >> vertex[i].data;
 
 -         }
 
 -         cout << "Input edges:";
 
 -         cin >> T;
 
 -         for (int i = 1; i < T+1; i++)
 
 -         {
 
 -                 int a, b;
 
 -                 edgenode *cp = NULL;
 
 -                 cin >> a >> b;
 
 -                 if (vertex[a].np == NULL)
 
 -                 {
 
 -                         cp = new edgenode;
 
 -                         vertex[a].np = cp;
 
 -                 }
 
 -                 else
 
 -                 {
 
 -                         cp = vertex[a].np;
 
 -                         while (cp->np != NULL)
 
 -                         {
 
 -                                 cp = cp->np;
 
 -                         }
 
 -                         edgenode *p = cp;
 
 -                         cp = new edgenode;
 
 -                         p->np = cp;
 
 -                 }
 
 -                 cp->index = b;
 
 -         }
 
 - }
 
  
- void research()
 
 - {
 
 -         int n = vertex[0].data;
 
 -         for (int i = 1; i <= n; i++)
 
 -         {
 
 -                 edgenode *p=vertex[i].np;
 
 -                 cout << vertex[i].data << "——>" << vertex[p->index].data;
 
 -                 while (p->np != NULL)
 
 -                 {
 
 -                         p = p->np;
 
 -                         cout << "——>" << vertex[p->index].data;
 
 -                 }
 
 -                 cout << endl;
 
 -         }
 
 - }
 
  
- int main()
 
 - {
 
 -         Input();
 
 -         research();
 
 -         system("PAUSE");
 
 - }
 
  复制代码 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |