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]);
}
}
}
}
}