码迷,mamicode.com
首页 > 其他好文 > 详细

2016qut暑假集训——图论篇

时间:2016-08-03 15:00:44      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

  Q1(Problem source : sdut 2141):

 

题目描述

给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

输入

输入第一行为整数n(0< n <100),表示数据的组数。 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

输出

输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。
  分析:非常基本的基于邻接表的宽搜输出遍历序列的题目。
 
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 120;
int G[maxn][maxn];
int visit[maxn];

void bfs(int m ,int star)
{
     printf("%d",star);
     visit[star] = 1;
     queue<int> q;
     q.push(star);

     while(!q.empty())
     {
              int now = q.front();
              q.pop();
              for(int i = 0;i < m;i++)
              {
                    if(!visit[i] && G[now][i] == 1)
                    {
                         printf(" %d",i);
                         q.push(i);
                         visit[i] = 1;
                    }
              }
     }
     printf("\n");

}
int main()
{
    int n;
    int k , t , m;
    scanf("%d",&n);
    while(n--)
    {
        memset(G , 0 , sizeof(G));
        memset(visit , 0 , sizeof(visit));

        int x , y;
        scanf("%d %d %d",&k , &m , &t);
         for(int i = 1;i <= m;i++)
         {
              scanf("%d%d",&x,&y);
              G[x][y] = 1;
              G[y][x] = 1;
         }

         bfs(m , t);


    }
}

 

  Q2(Problem source:sdut 2142):

 

题目描述

给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

输入

输入第一行为整数n(0< n <100),表示数据的组数。 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

输出

输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。
  分析:相对邻接矩阵的存图方式,邻接表更加节省时间和空间,但是代价就是在编码的时候较之前难度有略微的上升。这里要充分理解临界表<vector>G[i]的含义,G[now][i]是与now相连的节点而i不是。
  简单的参考代码如下:
 
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 120;
vector<int> G[maxn];
int visit[maxn];

void bfs(int star)
{
     printf("%d",star);
     visit[star] = 1;
     queue<int> q;
     q.push(star);

     while(!q.empty())
     {
              int now = q.front();
              int next;
              q.pop();
              for(int i = 0;i < G[now].size();i++)
              {
                   next = G[now][i];
                    if(!visit[next])
                    {

                         printf(" %d",next);
                         q.push(next);
                         visit[next] = 1;
                    }
              }
     }
     printf("\n");

}
int main()
{
    int n;
    int k , t , m;
    scanf("%d",&n);
    while(n--)
    {


        int x , y;
        scanf("%d %d %d",&k , &m , &t);
        for(int i = 0;i < k;i++)
                 G[i].clear();
        memset(visit , 0 , sizeof(visit));

         for(int i = 1;i <= m;i++)
         {
              scanf("%d%d",&x,&y);
             G[x].push_back(y);
             G[y].push_back(x);
         };


         bfs(t);


    }
}

 

2016qut暑假集训——图论篇

标签:

原文地址:http://www.cnblogs.com/rhythmic/p/5732491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!