问题描述
小弟最近在研究dijkstra双向算法,原来是用C++设计的,运行成功。然后老师要求做界面,改成用C#编写,然后就不行了。大部分东西没有改,只是将一些写法改成了符合C#的格式,但是运行后(错误已全部调试完毕),点击“最短路径”后程序无反应,CPU100%,应该是进入了死循环,小弟怀疑在读取存着路径值的文件S2.txt时候出错,小弟C#比较烂,各位大哥大姐帮小弟看看吧,多谢了!下面是程序:privatevoidbutton1_Click(objectsender,EventArgse){constintN=30;inta=0,s=0,l=0,i=0,j=0,oper1=0,oper2=0,k=0,t=0,p=0,times=0;//s为起始节点,l为终止节点,oper为当时的工作节点doublemin1=0,min2=0;int[]num=newint[N];double[,]d=newdouble[N,N];double[,]S=newdouble[N,N];//d[n][n]表示两节点间最短路径的长度,用10000表示无穷大;S[n][n]表示邻接两点之间路程的权,V[n][n]是指速度的权,10000表示无穷大s=Convert.ToInt32(this.textBox1.Text);if(s>N||s<0)MessageBox.Show("请输入0-30内的数!");l=Convert.ToInt32(this.textBox2.Text);if(l>N||l<0)MessageBox.Show("请输入0-30内的数!");/*......以下for循环用于读入图......*/stringfile=@"d:S2.txt";StreamReadersr=newStreamReader(file);stringline;line=sr.ReadLine();string[]splits=newstring[1000];while(line!=null){if(!line.Equals("")){splits=line.Split(newchar[]{'','t','n'});}}intr=0;for(i=0;i<N;i++)for(j=0;j<N;j++)S[i,j]=Convert.ToDouble(splits[r++]);int[]con=newint[N];int[]sig=newint[N];int[]sog=newint[N];int[]don=newint[N];//用con[n]表示n号节点的上一节点,sig[n]=-1表示已经n号节点当过工作节点for(i=0;i<N;i++)//初始化所有节点间的最短路径长度for(j=0;j<N;j++)d[i,j]=10000;for(i=0;i<N;i++)//使所有节点都为临时节点{sig[i]=0;sog[i]=0;}for(i=0;i<N;i++)d[i,i]=0;con[s]=-1;don[l]=-1;//表示起始节点无上一节点sig[s]=-1;sog[l]=-1;//表示起始节点正成为工作节点oper1=s;oper2=l;//让工作节点为起始节点times=0;booltru=true;while(tru)//开始搜索最短路径{k=oper1;t=oper2;//记录工作节点便于后边判断是否还有能成为工作节点的节点for(i=0;i<N;i++)//此循环用于确定与工作节点邻接的临时节点的最短路径和它们的上一节点{if(S[oper1,i]<10000&&sig[i]==0){if(d[oper1,s]+S[oper1,i]<d[i,s]){d[i,s]=S[oper1,i]+d[oper1,s];con[i]=oper1;}}if(S[oper2,i]<10000&&sog[i]==0){if(d[oper2,l]+S[oper2,i]<d[i,l]){d[i,l]=S[oper2,i]+d[oper2,l];don[i]=oper2;}}times++;}for(i=0;i<N;i++)//以下两个for循环用于确定下一工作节点if(d[i,s]!=-1&&sig[i]==0){min1=d[i,s];oper1=i;break;}for(i=0;i<N;i++)if(d[i,l]!=-1&&sog[i]==0){min2=d[i,l];oper2=i;break;}for(i=0;i<N;i++){if(sig[i]==0&&d[i,s]!=-1&&d[i,s]<min1){min1=d[i,s];oper1=i;}if(sog[i]==0&&d[i,l]!=-1&&d[i,l]<min2){min2=d[i,l];oper2=i;}}if(oper1==k||oper2==t){this.textBox3.Text="没有最短路径!";break;}for(i=0;i<N;i++)if(con[i]==oper2||don[i]==oper1)gotoshuchu;//如果其中有接上的,则说明已经找到工作节点了{sig[oper1]=-1;sog[oper2]=-1;}//否则则使新的工作节点表示为-1以区别于临时节点}/*输出最短路径*/shuchu:stringmsg="";if(con[i]==oper2){d[l,s]=d[oper2,s]+d[oper2,l];p=i;do{p=con[p];num[a++]=p;}while(p!=s);while(--a>=0)msg+=num[a]+"-";p=don[oper2];while(p!=-1){msg+=p+"-";p=don[p];}}elseif(don[i]==oper1){d[l,s]=d[oper1,l]+d[oper1,s];p=oper1;do{p=con[p];num[a++]=p;}while(p!=s);while(--a>=0)msg+=num[a]+"-";p=oper1;while(p!=-1){msg+=p+"-";p=don[p];}}this.textBox3.Text=msg;this.textBox4.Text=Convert.ToString(d[l,s]);}
解决方案
解决方案二:
S2是一些值,某点到某点的直接距离,假如这两点没有直接相连,就设为10000