#include<bits/stdc++.h>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<cmath>
头文件镇楼。
然而我又总是觉得什么都没有听到呢;
图的构建一般有四三种方法(前向星不常用);
一、邻接矩阵
先声明一下,邻接矩阵适用于点少边多的情况;
其中心思想是用一个bool数组来记录一个遍是否存在;
代码如下
int n,m;//n为点数,m为边数;
bool flag[100][100];
int main()
{
cin>>n>>m;
memset(flag,0,sizeof(flag));
int x,y,z;//z为权值;
for(int i = 1; i <= m; i++)
{
cin>>x>>y;
flag[x][y] = z;
}
}
即是如上(用于表示x与y之间有边 or 从x到y有一条有向边);
二、边表
这个就适用于点多边少的情况了;
用一个结构体(或两个一维数组)来记录每一条边的左右两个端点;
代码如下
int n,m;//n为点数,m为边数;
struct node{
int x;
int y;
int z;//同上,为权值;
}a[10000];
int main()
{
cin>>n>>m;
for(int i = 1 ;i <= m; i++)
{
cin >> a[i].x >> a[i].y >> a[i].z;
}
}
三、邻接表
最常用的来喽;
其中心思想较为憋屈;
下作简介;
就是先记录下每一条边的编号及其两端端点,然后以其一个端点为下标来记录这个点与这条边相连存入下一条有同样端点的边时再将这一条边引用;
代码如下;
#inlcude<bits/stdc++.h
using namespace std;
int len = 0;
int lin[100000];
struct node{
int str;//这条边的起点 ;
int end;//其终点 ;
int value;//这条边的权值;
int next;//与这条边的起点相连的上一条边的编号;
}a[1000005];
void add(int x, int y, int z)
{
a[++len].str = x;
a[len].value = z;//记录权值;
a[len].end = y;//因为上一步已经加过了,所以不用再加;
a[len].next = lin[x];//令这条边的关联边为上一个以x为起点的点;
lin[x] = len;//此步是为了记录下以x为起点的最近更新的一条边;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=m;i++)
{
cin>>x>>y>>z;
add(x,y,z);
}
}
呼!终于搞懂了呢,让我开心一会;
接下来,记什么好呢;
四、树
好的,下面来记树吧;
树者,有根有叶,四处开叉者也;
cout<<endl;
接下来,要进入算法阶段了
累了,写不下去了,剩下的下一次吧。
因篇幅问题不能全部显示,请点此查看更多更全内容