1.邻接矩阵
2.前向星
//所需要的数据结构
int head[maxn]; //下标表示起点, 存储起点的第一条边的位置
struct EdgeNode
{
int from; //起点
int to; //终点
int w; //权值
};
EdgeNode Edge[maxn];
//比较函数
bool cmp(EdgeNode a, EdgeNode b)
{
if(a.from == b.from && a.to == b.to) return a.w < b.w;
if(a.from == b.from) return a.to < b.to;
return a.from < b.from;
}
//读入数据
cin>>n>>m;
for(int i=1; i<=m; i++) cin>>Edge[i].from>>Edge[i].to>>Edge[i].w;
sort(Edge+1, Edge+1+m, cmp);
memset(head, -1, sizeof(head));
head[Edge[1].from]=1;
for(int i=2; i<=m; i++)
if(Edge[i].from != Edge[i-1].from) head[Edge[i].from] = i; // 确定各起点的第一条边的位置
//遍历代码
for(int i=1; i<=n; i++)
for(int k=head[i]; Edge[k].from==i && k<=m; k++)
cout<<Edge[k].from<<' '<<Edge[k].to<<' '<<Edge[k].w<<endl;
3.邻接表
注意:n个顶点e条边的无向图的邻接表表示中有n个顶点表结点和2e个边表结点。(换句话说,每条边(i,j)在邻接表 中出现两次:一次在关于i的邻接表中,另一次在关于j的邻接表中)
struct EdgeNode //邻接表节点
{
int to;
int w;
Edgenode *next;//指向下一条边的指针
};
struct VNode//起点表节点
{
int from;
EdgeNode *first//邻接表头指针
}
VNode Adjlist[1000]; //整个图的邻接表
cin>>i>>j>>w;
EdgeNode *p = new EdgeNode(); // 新建一条边
p->to = j;
p->w = w;
p->next = Adjlist[i].first; //将新节点加到链表头部
Adjlist[i].first = p;
//遍历代码
for(int i=1; i<=n; i++) //每个节点都当作头节点扫过去
for(Edgenode *k = Adjlist[i].first; k!=null; k=k->next)
cout << i << ' ' << k->to << ' ' << k->w << endl;
4.邻接表(vector模拟链表实现)
struct EdgeNode //边表节点类型
{
int to; //定点的序号
int w; //权值
};
vector<EdgeNode> map[maxn];
//信息存储
EdgeNode e;
cin>>i>>j>>w;
e.to=j;
e.w=w;
map[i].push_back(e);
//遍历代码
for(int i=1; i<=n; i++)
for(vector<EdgeNode>::iterator k=map[i].begin(); k!=map[i].end; k++)
{
node t=*k;
cout<<i<<' '<<t.to<<' '<< t.w<< endl;
5.链式前向星
采用数组模拟链表的方式实现邻接表的功能,并且使用很少的额外空间
int head[n]; strcut EdgeNode { int to; int w; int next; }; EdgeNode Edges[m]; cin>>i>>j>>w; //k表示当前输入第k条边 Edges[k].to=j; Edges[k].w=w; Edges[k].next=head[i]; head[i]=k; //head数组表示第i个点的第一条边的位置 //遍历代码 for(int i=1; i<=n; i++) for(int k=head[i]; k!=-1; k=Edges[k].next) cout<<i<<" "<<Edges[k].to<<' '<<Edges[k].w<<endl;