爆管分析代码

来源:互联网 发布:安卓源码下载 编辑:程序博客网 时间:2024/03/29 17:44

文章摘自 http://www.cnblogs.com/melon611/archive/2007/09/20/673422.html

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace 爆管关阀算法
{
    public partial class Form1 : Form
    {
        ArrayList Nodes = new ArrayList();//所有节点

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 添加节点及类型
        /// </summary>
        private void AddNode()
        {
            //SY为水源、FM为阀门、2T为二通、3T为三通、4T为四通、1T这终点
            Nodes.Add(new Node(0, "SY"));
            Nodes.Add(new Node(1, "FM"));
            Nodes.Add(new Node(2, "3T"));
            Nodes.Add(new Node(3, "FM"));
            Nodes.Add(new Node(4, "2T"));
            Nodes.Add(new Node(5, "FM"));
            Nodes.Add(new Node(6, "3T"));
            Nodes.Add(new Node(7, "2T"));
            Nodes.Add(new Node(8, "2T"));
            Nodes.Add(new Node(9, "FM"));
            Nodes.Add(new Node(10, "FM"));
            Nodes.Add(new Node(11, "FM"));
            Nodes.Add(new Node(12, "3T"));
            Nodes.Add(new Node(13, "3T"));
            Nodes.Add(new Node(14, "FM"));
            Nodes.Add(new Node(15, "3T"));
            Nodes.Add(new Node(16, "4T"));
            Nodes.Add(new Node(17, "FM"));
            Nodes.Add(new Node(18, "4T"));
            Nodes.Add(new Node(19, "1T"));
            Nodes.Add(new Node(20, "FM"));
            Nodes.Add(new Node(21, "2T"));
            Nodes.Add(new Node(22, "FM"));
            Nodes.Add(new Node(23, "3T"));
            Nodes.Add(new Node(24, "FM"));
            Nodes.Add(new Node(25, "2T"));
            Nodes.Add(new Node(26, "FM"));
            Nodes.Add(new Node(27, "3T"));
            Nodes.Add(new Node(28, "1T"));
            Nodes.Add(new Node(29, "2T"));
            Nodes.Add(new Node(30, "4T"));
            Nodes.Add(new Node(31, "2T"));
            Nodes.Add(new Node(32, "2T"));
            Nodes.Add(new Node(33, "3T"));
            Nodes.Add(new Node(34, "FM"));
            Nodes.Add(new Node(35, "2T"));
            Nodes.Add(new Node(36, "1T"));
            Nodes.Add(new Node(37, "1T"));
            Nodes.Add(new Node(38, "1T"));
            Nodes.Add(new Node(39, "1T"));
            Nodes.Add(new Node(40, "FM"));
            Nodes.Add(new Node(41, "3T"));
            Nodes.Add(new Node(42, "1T"));
            Nodes.Add(new Node(43, "1T"));
            Nodes.Add(new Node(44, "2T"));
            Nodes.Add(new Node(45, "FM"));
            Nodes.Add(new Node(46, "FM"));
            Nodes.Add(new Node(47, "2T"));
        }

        /// <summary>
        /// 构建邻接矩阵
        /// </summary>
        private void BuildRect()
        {
            for (int i = 0; i < Nodes.Count; i++)
            {
                ((Node)Nodes[i]).Links.Clear();
            }

            ///下面代码为各节点设置连接点。
            ((Node)Nodes[0]).Links.Add(((Node)Nodes[1]).ID);

            ((Node)Nodes[1]).Links.Add(((Node)Nodes[0]).ID);
            ((Node)Nodes[1]).Links.Add(((Node)Nodes[2]).ID);

            ((Node)Nodes[2]).Links.Add(((Node)Nodes[1]).ID);
            ((Node)Nodes[2]).Links.Add(((Node)Nodes[3]).ID);
            ((Node)Nodes[2]).Links.Add(((Node)Nodes[8]).ID);

            ((Node)Nodes[3]).Links.Add(((Node)Nodes[2]).ID);
            ((Node)Nodes[3]).Links.Add(((Node)Nodes[4]).ID);

            ((Node)Nodes[4]).Links.Add(((Node)Nodes[3]).ID);
            ((Node)Nodes[4]).Links.Add(((Node)Nodes[5]).ID);

            ((Node)Nodes[5]).Links.Add(((Node)Nodes[4]).ID);
            ((Node)Nodes[5]).Links.Add(((Node)Nodes[6]).ID);

            ((Node)Nodes[6]).Links.Add(((Node)Nodes[5]).ID);
            ((Node)Nodes[6]).Links.Add(((Node)Nodes[7]).ID);
            ((Node)Nodes[6]).Links.Add(((Node)Nodes[9]).ID);

            ((Node)Nodes[7]).Links.Add(((Node)Nodes[6]).ID);
            ((Node)Nodes[7]).Links.Add(((Node)Nodes[10]).ID);

            ((Node)Nodes[8]).Links.Add(((Node)Nodes[2]).ID);
            ((Node)Nodes[8]).Links.Add(((Node)Nodes[11]).ID);

            ((Node)Nodes[9]).Links.Add(((Node)Nodes[6]).ID);
            ((Node)Nodes[9]).Links.Add(((Node)Nodes[16]).ID);

            ((Node)Nodes[10]).Links.Add(((Node)Nodes[7]).ID);
            ((Node)Nodes[10]).Links.Add(((Node)Nodes[18]).ID);

            ((Node)Nodes[11]).Links.Add(((Node)Nodes[8]).ID);
            ((Node)Nodes[11]).Links.Add(((Node)Nodes[12]).ID);

            ((Node)Nodes[12]).Links.Add(((Node)Nodes[11]).ID);
            ((Node)Nodes[12]).Links.Add(((Node)Nodes[13]).ID);
            ((Node)Nodes[12]).Links.Add(((Node)Nodes[20]).ID);


            ((Node)Nodes[13]).Links.Add(((Node)Nodes[12]).ID);
            ((Node)Nodes[13]).Links.Add(((Node)Nodes[14]).ID);
            ((Node)Nodes[13]).Links.Add(((Node)Nodes[21]).ID);

            ((Node)Nodes[14]).Links.Add(((Node)Nodes[13]).ID);
            ((Node)Nodes[14]).Links.Add(((Node)Nodes[15]).ID);

            ((Node)Nodes[15]).Links.Add(((Node)Nodes[14]).ID);
            ((Node)Nodes[15]).Links.Add(((Node)Nodes[16]).ID);
            ((Node)Nodes[15]).Links.Add(((Node)Nodes[25]).ID);

            ((Node)Nodes[16]).Links.Add(((Node)Nodes[9]).ID);
            ((Node)Nodes[16]).Links.Add(((Node)Nodes[15]).ID);
            ((Node)Nodes[16]).Links.Add(((Node)Nodes[17]).ID);
            ((Node)Nodes[16]).Links.Add(((Node)Nodes[26]).ID);

            ((Node)Nodes[17]).Links.Add(((Node)Nodes[16]).ID);
            ((Node)Nodes[17]).Links.Add(((Node)Nodes[18]).ID);

            ((Node)Nodes[18]).Links.Add(((Node)Nodes[10]).ID);
            ((Node)Nodes[18]).Links.Add(((Node)Nodes[17]).ID);
            ((Node)Nodes[18]).Links.Add(((Node)Nodes[19]).ID);
            ((Node)Nodes[18]).Links.Add(((Node)Nodes[27]).ID);

            ((Node)Nodes[19]).Links.Add(((Node)Nodes[18]).ID);

            ((Node)Nodes[20]).Links.Add(((Node)Nodes[12]).ID);
            ((Node)Nodes[20]).Links.Add(((Node)Nodes[30]).ID);

            ((Node)Nodes[21]).Links.Add(((Node)Nodes[13]).ID);
            ((Node)Nodes[21]).Links.Add(((Node)Nodes[22]).ID);

            ((Node)Nodes[22]).Links.Add(((Node)Nodes[21]).ID);
            ((Node)Nodes[22]).Links.Add(((Node)Nodes[23]).ID);

            ((Node)Nodes[23]).Links.Add(((Node)Nodes[22]).ID);
            ((Node)Nodes[23]).Links.Add(((Node)Nodes[24]).ID);
            ((Node)Nodes[23]).Links.Add(((Node)Nodes[33]).ID);

            ((Node)Nodes[24]).Links.Add(((Node)Nodes[23]).ID);
            ((Node)Nodes[24]).Links.Add(((Node)Nodes[25]).ID);

            ((Node)Nodes[25]).Links.Add(((Node)Nodes[15]).ID);
            ((Node)Nodes[25]).Links.Add(((Node)Nodes[24]).ID);

            ((Node)Nodes[26]).Links.Add(((Node)Nodes[16]).ID);
            ((Node)Nodes[26]).Links.Add(((Node)Nodes[36]).ID);

            ((Node)Nodes[27]).Links.Add(((Node)Nodes[18]).ID);
            ((Node)Nodes[27]).Links.Add(((Node)Nodes[28]).ID);
            ((Node)Nodes[27]).Links.Add(((Node)Nodes[37]).ID);

            ((Node)Nodes[28]).Links.Add(((Node)Nodes[27]).ID);

            ((Node)Nodes[29]).Links.Add(((Node)Nodes[30]).ID);
            ((Node)Nodes[29]).Links.Add(((Node)Nodes[38]).ID);

            ((Node)Nodes[30]).Links.Add(((Node)Nodes[20]).ID);
            ((Node)Nodes[30]).Links.Add(((Node)Nodes[29]).ID);
            ((Node)Nodes[30]).Links.Add(((Node)Nodes[31]).ID);
            ((Node)Nodes[30]).Links.Add(((Node)Nodes[40]).ID);

            ((Node)Nodes[31]).Links.Add(((Node)Nodes[30]).ID);
            ((Node)Nodes[31]).Links.Add(((Node)Nodes[39]).ID);

            ((Node)Nodes[32]).Links.Add(((Node)Nodes[33]).ID);
            ((Node)Nodes[32]).Links.Add(((Node)Nodes[44]).ID);

            ((Node)Nodes[33]).Links.Add(((Node)Nodes[23]).ID);
            ((Node)Nodes[33]).Links.Add(((Node)Nodes[32]).ID);
            ((Node)Nodes[33]).Links.Add(((Node)Nodes[34]).ID);

            ((Node)Nodes[34]).Links.Add(((Node)Nodes[33]).ID);
            ((Node)Nodes[34]).Links.Add(((Node)Nodes[35]).ID);

            ((Node)Nodes[35]).Links.Add(((Node)Nodes[34]).ID);
            ((Node)Nodes[35]).Links.Add(((Node)Nodes[47]).ID);

            ((Node)Nodes[36]).Links.Add(((Node)Nodes[26]).ID);

            ((Node)Nodes[37]).Links.Add(((Node)Nodes[27]).ID);

            ((Node)Nodes[38]).Links.Add(((Node)Nodes[29]).ID);

            ((Node)Nodes[39]).Links.Add(((Node)Nodes[31]).ID);

            ((Node)Nodes[40]).Links.Add(((Node)Nodes[30]).ID);
            ((Node)Nodes[40]).Links.Add(((Node)Nodes[41]).ID);

            ((Node)Nodes[41]).Links.Add(((Node)Nodes[40]).ID);
            ((Node)Nodes[41]).Links.Add(((Node)Nodes[42]).ID);
            ((Node)Nodes[41]).Links.Add(((Node)Nodes[43]).ID);

            ((Node)Nodes[42]).Links.Add(((Node)Nodes[41]).ID);

            ((Node)Nodes[43]).Links.Add(((Node)Nodes[41]).ID);

            ((Node)Nodes[44]).Links.Add(((Node)Nodes[32]).ID);
            ((Node)Nodes[44]).Links.Add(((Node)Nodes[45]).ID);

            ((Node)Nodes[45]).Links.Add(((Node)Nodes[44]).ID);
            ((Node)Nodes[45]).Links.Add(((Node)Nodes[46]).ID);

            ((Node)Nodes[46]).Links.Add(((Node)Nodes[45]).ID);
            ((Node)Nodes[46]).Links.Add(((Node)Nodes[47]).ID);

            ((Node)Nodes[47]).Links.Add(((Node)Nodes[46]).ID);
            ((Node)Nodes[47]).Links.Add(((Node)Nodes[35]).ID);
        }

        /// <summary>
        /// 得到关闭阀门
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            BuildRect();

            int iBegin = 0, iEnd = 0;
            iBegin = Convert.ToInt32(lstBegin.SelectedItem);
            iEnd = Convert.ToInt32(lstEnd.SelectedItem);

            //断开起址两点间的关连
            ((Node)Nodes[iBegin]).Links.Remove(iEnd);
            ((Node)Nodes[iEnd]).Links.Remove(iBegin);

            //下面为广度搜索方法
            ArrayList searchList = new ArrayList();//等待搜索的节点(编号)列表
            searchList.Add(iBegin);
            searchList.Add(iEnd);

            ArrayList resultList = new ArrayList();//关闭阀门(编号)列表
            ArrayList searchedList = new ArrayList();//己搜索过的节点(编号)列表

            while (searchList.Count != 0)
            {
                int id = (int)searchList[searchList.Count - 1];
                searchList.RemoveAt(searchList.Count - 1);

                if (((Node)Nodes[id]).Type.Equals("FM") == true && resultList.IndexOf(id) < 0)//节点为阀门且结果中没有的
                {
                    resultList.Add(id);//放入结果集
                }
                else
                {
                    searchedList.Add(id);//放入己访问过的节点集合

                    int n = ((Node)Nodes[id]).Links.Count;
                    //MessageBox.Show(n.ToString());
                    for (int i = 0; i < n; i++)
                    {
                        //MessageBox.Show(((Node)Nodes[id]).Links[i].ToString());
                        if (searchedList.IndexOf(((Node)Nodes[id]).Links[i]) < 0)
                        {
                            searchList.Add(((Node)Nodes[id]).Links[i]);
                        }
                    }
                }
            }

            //上面的代码己得到了初步关闭的阀门,但其中有些阀门是可关可不关的,还应该将其去除
            //将关闭阀门显示在列表中
            lstFM.Items.Clear();
            for (int k = 0; k < resultList.Count; k++)
            {
                lstFM.Items.Add(resultList[k]);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AddNode();

            for (int i = 0; i < Nodes.Count; i++)
            {
                Node n = (Node)Nodes[i];
                lstBegin.Items.Add(n.ID.ToString());
                lstEnd.Items.Add(n.ID.ToString());
            }
        }

        private bool isFindSY(Node n, ArrayList resultList)//判断能否从阀门n找到水源
        {
            ArrayList searchList = new ArrayList();//等待搜索的节点(编号)列表
            ArrayList searchedList = new ArrayList();

            searchList.Clear();
            searchedList.Clear();

            for (int j = 0; j < n.Links.Count; j++)
            {
                searchedList.Add(((Node)Nodes[(int)n.Links[j]]).ID);
                if (((Node)Nodes[(int)n.Links[j]]).Type.Equals("SY") == true)//从该阀门出发能找到水源
                {
                    return true;
                }
                else if (resultList.IndexOf(((Node)Nodes[j]).ID) > -1)//从该阀门出发找水源过程中,遇到在初关闭列表中的阀门
                    continue;
                else
                {
                    if (searchedList.IndexOf(((Node)Nodes[(int)n.Links[j]]).ID) < 0)
                        searchList.Add(((Node)Nodes[(int)n.Links[j]]).ID);
                }
            }

            while (searchList.Count != 0)
            {
                int id = (int)searchList[searchList.Count - 1];
                searchList.RemoveAt(searchList.Count - 1);
                searchedList.Add(id);

                for (int s = 0; s < ((Node)Nodes[id]).Links.Count - 1; s++)
                {
                    Node m = (Node)Nodes[(int)((Node)Nodes[id]).Links[s]];
                    if (m.Equals("SY") == true)//从该阀门出发能找到水源
                    {
                        MessageBox.Show("while+" + ((Node)Nodes[s]).ID.ToString());
                        return true;
                    }
                    else if (resultList.IndexOf(((Node)Nodes[s]).ID) > -1)//从该阀门出发找水源过程中,遇到在初关闭列表中的阀门
                        continue;
                    else
                        if (searchedList.IndexOf(m.ID) < 0)
                        {
                            searchList.Add(m.ID);
                        }
                }
            }

            return false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            BuildRect();

            ArrayList resultList = new ArrayList();//关闭阀门(编号)列表

            for(int i=0;i<lstFM.Items.Count;i++)
            {
                resultList.Add(lstFM.Items[i]);
            }

            //下面的代码去除可关可不关的阀门.
            lstYX.Items.Clear();

            for (int i = 0; i < resultList.Count; i++)
            {
                if (isFindSY((Node)Nodes[(int)resultList[i]], resultList) == true)
                {
                    lstYX.Items.Add(resultList[i]);
                }
            }
        }

    }
}