一对一:链表 一对多:树 多对多:图 图中的点:顶点 图中点与点连接的线:边 一个顶点周围连接着多少边叫做度 一个图包含多少个顶点叫做图的阶 一个五阶图,表示这个图包含5个顶点 在图中,如果一条边的两端顶点互通,无向边 在无向图中,任意两个顶点存在相连的途径,连通图 如果是有向图,通常需要相互有途径,不能单向 存链表:指针 存树:指针和数组(完全二叉树结构) 存图:邻接矩阵,邻接表 无向图例子 输入:顶点数量n,边数m,接下来输入m行数据 每行三个整数,分别代表两个点的编号(从1开始)和他们之间的具体 再输入一个顶点编号x 5 7 1 2 5 2 3 7 1 3 4 2 5 6 3 5 8 4 1 2 4 5 3 x 输出: x点的相邻的顶点数量,并按照从近到远输出顶点编号 struct node{ int num; int line; } k[1000]; bool cmp(node a,node b){ if(a.line==b.line) return a.num<b.num; return a.line<b.line; } int t[100][100]; int n,m,x,a,b,l; int main(){ cin>>n>>m; for(int i=0;i<m;i++){ cin>>a>>b>>l; t[a][b]=t[b][a]=l; t[0][b]++; t[a][0]++; } cin>>x; cout<<t[0][x]<<endl; int j=0; for(int i=1;i<=n;i++){ if(t[i][x]!=0){ k[j].num=i; k[j].line=t[i][x]; j++; } } sort(k,k+j,cmp); for(int i=0;i<j;i++){ cout<<k[i].num<<" "; } return 0; } dfs(){ if(能走) dfs if(能走) dfs if(能走) dfs if(能走) dfs } bfs(){ 入队 while(队不空){ 队头 陆续入队 出队 } } dfs 栈(递归) 有返回(回溯) 判断是否有解 bfs 队列 无返回(回溯) 判断最优解 作业: 输入一个图 输入一个顶点 按照dfs和bfs的方案,从这个顶点开始,输出遍历的顺序 (责任编辑:admin) |