1. 程式人生 > >06-圖1 列出連通集 (25 分)

06-圖1 列出連通集 (25 分)

card 通過 reac string 包含 tasks 鄰接 查找 lse

06-圖1 列出連通集 (25 分)

給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N?1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:

輸入第1行給出2個整數N(0<N10)和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()); } } } }

06-圖1 列出連通集 (25 分)