唉o(︶︿︶)o ,我果然还是玩不了 邻接链表,捣鼓了一晚上,只实现了 DFS的搜索 ,BFS 至今还不会,快回宿舍了,等校赛后再研究吧
邻接链表:
n个顶点m条边的无向图,表示中有 n 个顶点表结点和 2m 个边表结点。(也就是说,每条边 u-v 在邻接表 中出现两次:一次在关于u的邻接表中,另一次在关于v的邻接表中)PS:注意是无向图,有向图时,DFS搜索会漏点,也就是说只能访问到 当前点 指向 的 点;
优点:
便于查找任一顶点的关联边及关联点,查找运算的时间复杂性平均为
O(m/n);
缺点:
要查找一个顶点的前驱顶点和以此顶点为终点的边、以及该顶点的入度就不方便了,需要扫描整个表,时间复杂度为O(n+e)。可以用十字邻接表改进;<------ PS:这是。。。。还没搞过呢!!!
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
const int maxe = 10001;
using namespace std;
struct node{
int to,w;
node *next;
}*head[maxe];//head[a]以a为起点的第一条边
int n,m;
bool visbfs[maxe]={0};
bool visdfs[maxe]={0};
void init()//初始化
{
memset(head,NULL,sizeof(head));
memset(visbfs,0,sizeof(visbfs));
memset(visdfs,0,sizeof(visdfs));
}
void add(int a,int b,int c)//加边
{
node *p = new node;
p->to = b;
p->w = c;
p->next = head[a];//指向a的下一条边
head[a] = p;
}
void Print()//打印原图
{
int i;
for(i = 1;i<=n;i++)
{
node *q;
for(q = head[i];q!=NULL;q=q->next)
{
printf("%d->%d %d\n",i,q->to,q->w);
}
}
}
void DFS(int x)
{
visdfs[x] = true;
printf("%d\n",x);
node *q;
for(q = head[x];q!=NULL;q = q->next)
{
if(!visdfs[q->to])
DFS(q->to);
}
}
int main()
{
int a,b,c,in;
while(scanf("%d%d",&n,&m))
{
init();
for(int i = 0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
in = 1;//以1为例,开始遍历
puts("连接方式");
Print();
puts("dfs搜索");
DFS(in);
}
return 0;
}
5 6
1 2 5
2 3 4
3 1 4
3 5 8
4 5 1
2 5 9
2 3 4
3 1 4
3 5 8
4 5 1
2 5 9