06-图1 列出连通集 (25 分)

06-图1 列出连通集 (25 分)

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N?1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v?1?? v?2?? ... v?k?? }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

输出样例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }

越来越没什么兴趣了

这个不是完全版,有一条没通过,不知道为啥
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Net;
using System.Text;
using System.Xml;

class P
{
    public P(string s)
    {
        var ss = s.Split(‘ ‘);
        x = int.Parse(ss[0]);
        y = int.Parse(ss[1]);
        check = false;

        if (x > y)
        {
            int temp = x;
            x = y;
            y = temp;
        }

    }
    public P(string s, int i)
    {

        var ss = s.Split(‘ ‘);
        x = int.Parse(ss[0]);
        y = int.Parse(ss[1]);
        check = false;
    }
    public bool check;
    public int x, y;
}

class T
{
    static void Main(string[] args)
    {
        P first = new P(Console.ReadLine(), 1);
        List<P> list = new List<P>();

        for (int i = 0; i < first.y; i++)
        {

            list.Add(new P(Console.ReadLine()));
        }
        //排序
        list.Sort(delegate (P a, P b)
        {
            if (a.x < b.x) return -1;

            if (a.x > b.x) return 1;
            if (a.x == b.x)
            {
                if (a.y < b.y) return -1;

                if (a.y > b.y) return 1;

            }
            return 0;
        });

//=============
        int temp = -1;
        for (int i = 0; i < first.x; i++)
        {
            if (list.Count > i)
            {
                if (list[i].x != i)
                {
                    list.Insert(i, new P(i + " "+temp--));//特意插入一些不存在的 线.因为最后他要求从大到小的输出.所以加了这段
                }
            }
            else
            {
                list.Add( new P(i + " "+temp--));
            }
        }

//===================

        #region DFS

        List<P> list2 = new List<P>();
        list2.AddRange(list);
        DFS(first, list2);

        #endregion

        BFS(first, list);

        return;

    }

    static List<int> dGet(List<P> l, int x)
    {
        List<int> lp = new List<int>();

        for (int i = 0; i < l.Count; i++)
        {
            var item = l[i];

            //查找线的第一个节点,此点存在线的列表里,把这个点和线的另一端的点,加入打印列表,删除这个线,递归找另一端,是不是在线的列表里.
            if (item.y == x)
            {
                lp.Add(item.y);
                lp.Add(item.x);

                l.RemoveAt(i);
                lp.AddRange(dGet(l, item.x));
                i--;
            }
            if (item.x == x)
            {
                lp.Add(item.x);
                lp.Add(item.y);
                l.RemoveAt(i);
                lp.AddRange(dGet(l, item.y));
                i--;
            }

        }

        return lp;

    }
    /// <summary>
    /// 在列表中的线,如果包含这个点,把另一端的点,返回,并把线删掉
    /// </summary>
    /// <param name="list"></param>
    /// <param name="x"></param>
    /// <returns></returns>
    static List<int> get(List<P> list, int x)
    {
        List<int> li = new List<int>();

        for (int i = 0; i < list.Count; i++)
        {
            var item = list[i];
            if (item.x == x)
            {
                li.Add(item.y);
                list.RemoveAt(i);
                i--;
            }
            if (item.y == x)
            {
                li.Add(item.x);
                list.RemoveAt(i);
                i--;
            }
        }

        return li;

    }

    private static void DFS(P first, List<P> list2)
    {
        List<int> treeList = new List<int>();
        List<int> LLL = new List<int>();

        //构建一个 所有点的表
        for (int i = 0; i < first.x; i++)
        {

            LLL.Add(i);
        }

        //当,给我的线,还有的话
        while (list2.Count > 0)
        {
            treeList.Clear();
            //查线的第一个节点,伸出去多少条线,
            var t = dGet(list2, list2[0].x);

            foreach (var item in t)
            {
                if (!treeList.Contains(item))
                {
                    treeList.Add(item);
                }

            }
            foreach (var item in treeList)
            {
                LLL.Remove(item);
            }

            print(treeList);

        }
        print(LLL, 1);
    }

    private static void BFS(P first, List<P> list)
    {
        List<int> LLL = new List<int>();
        for (int i = 0; i < first.x; i++)
        {
            LLL.Add(i);
        }

        List<int> treeList = new List<int>();
        while (list.Count > 0)
        {
            treeList.Clear();

            treeList.Add(list[0].x);

            for (int i = 0; i < treeList.Count; i++)
            {
                foreach (var item in get(list, treeList[i]))
                {
                    if (!treeList.Contains(item))
                    {
                        treeList.Add(item);

                    }
                }

            }
            foreach (var item in treeList)
            {
                LLL.Remove(item);
            }

            print(treeList);

        }

        print(LLL, 1);
    }

    private static void print(List<int> treeList, int i = 0)
    {
        if (treeList.Count > 0)
        {
            if (i > 0)//剩余部分,剩余的,都是单独的一个个
            {
                foreach (var item in treeList)
                {
                    if (item > -1)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append("{");

                        sb.Append(" " + item);

                        sb.Append(" }");

                        Console.WriteLine(sb.ToString());
                    }
                }
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("{");
                foreach (var item in treeList)
                {
                    if (item > -1)
                    {
                        sb.Append(" " + item);
                    }
                }
                sb.Append(" }");

                Console.WriteLine(sb.ToString());

            }
        }

    }
}

原文地址:https://www.cnblogs.com/interim/p/9774509.html

时间: 2024-08-07 03:13:42

06-图1 列出连通集 (25 分)的相关文章

PTA - - 06-图1 列出连通集 (25分)

06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数NN(0<N\le 100<N≤10)和EE,分别是图的顶点数和边数.随后EE行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{ v_1v?1?? v_2v?2?? ... v_kv?k?? 

06-图1 列出连通集 (25分)

题目描述 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N?1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数.随后E行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{v1 v2 ... vk}"的格式,每行输出一个连通集.先输出DFS的结果,再输出BFS的结果. 输入样例: 8 6 0 7

06-图1 列出连通集 (25分)(C语言邻接表实现)

题目地址:https://pta.patest.cn/pta/test/558/exam/4/question/9495 由于边数E<(n*(n-1))/2 所以我选用了邻接表实现,优先队列用循环队列实现: DFS基本思路: 1:选择一个点,标志已经访问过: 2:判断这个点的其他邻接点(访问顺序按题目是从小到大)是否访问过,来选择下一个点: 3:重复第2点知道全部点已经访问过. 伪代码如下 DFS( Vertex v ) { Visit( V ); Visited[V] = true; fore

7-1 列出连通集 (25 分)

7-1 列出连通集 (25 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N?1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数.随后E行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{ v?1?? v?2?? ... v?k?? }"的格式,每行输出一个连通集.先输出DFS的结果,再

1142 Maximal Clique (25 分)图

1142 Maximal Clique (25 分) A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex. (Quoted f

PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)

1013 Battle Over Cities (25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any oth

列出连通集

06-图1 列出连通集(25 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N?1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数.随后E行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{ v?1?? v?2?? ... v?k?? }"的格式,每行输出一个连通集.先输出DFS的结果,

PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)

1016 Phone Bills (25 分)   A long-distance telephone company charges its customers by the following rules: Making a long-distance call costs a certain amount per minute, depending on the time of day when the call is made. When a customer starts connec

4-9 二叉树的遍历 (25分)

4-9 二叉树的遍历   (25分) 输出样例(对于图中给出的树): Inorder: D B E F A G H C I Preorder: A B D F E C G H I Postorder: D E F B H G I C A Levelorder: A B C D F G I E H 代码:(都是遍历的算法) 1 // 4-9 二叉树的遍历 2 // 3 // Created by Haoyu Guo on 04/02/2017. 4 // Copyright ? 2017 Haoy