#include <iostream.h>
#include <malloc.h>
#define INFINITY 10000typedef struct { //构造邻接矩阵
int adj; //权
char *mes; //信息
}ArcCell,AdjM[10][10]; typedef struct { //构造无向图
int vexs[10]; //顶点
AdjM arcs; //邻接矩阵
int vexnum,arcnum; //顶点数、边数
}MGraph; int LocVex(MGraph G,int v) //查找顶点V
{
int i=0;
while(G.vexs[i]!=v)
{
++i; //查找下一顶点
}
return i; //返回i
}int CreatM(MGraph &G) //创建图用邻接矩阵表示
{
int v1,v2;
int i,j,w;
cout<<"040808_赵博_信息安全"<<endl;
cout<<"最小生成树问题,用Prim算法解决.用10个顶点代表10台电脑"<<endl;
cout<<"输入图G的边数,按回车确定,注意:边数应该在9到45之间"<<endl;
cin>>G.arcnum;
G.vexnum=10;
for(i=0;i<G.vexnum;++i)
{
G.vexs[i]=i+1; //顶点编号从1开始
}
for(i=0;i<G.vexnum;++i)
{
for(j=0;j<G.vexnum;++j)
{
G.arcs[i][j].adj=INFINITY; //两点之间没有连线的话认为权为INFINITY
G.arcs[i][j].mes=NULL; //这时没有边的相关信息
}
}
for(int k=0;k<G.arcnum;++k)
{
cout<<"输入第"<<k+1<<"条边的起点、终点和权,用空格分开"<<endl;
cin>>v1>>v2>>w; //输入一条边依附的两点及权值
i=LocVex(G,v1); //确定顶点V1在图中的位置
j=LocVex(G,v2); //确定顶点V2在图中的位置
G.arcs[i][j].adj=w; //无向图
G.arcs[j][i].adj=w;
}
return G.vexnum;
}int Prim(int g[10][10],int n,int u) //本程序用Prim算法构造最小生成树,从顶点u开始构造
{
int lowcost[10]; //lowcost[]存储当前集合U分别到剩余结点的权值最小边
int prevex[10]; //prevex[]存储权值最小边在U中的结点
int i,j,k,min;
for(i=0;i<n;i++)
{
lowcost[i]=g[u][i]; //记录u到各个顶点的权(此处指布线花费)
prevex[i]=0; //顶点未加入到最小生成树中
}
lowcost[u]=0; //标志顶点1加入U集合
for(i=0;i<n-1;i++) //形成n-1条边的生成树
{
min=INFINITY;
k=0;
for(j=0;j<n;j++) //寻找满足边的一个顶点在U,另一个顶点在V的最小边
if((lowcost[j]<min) && (lowcost[j]!=0))
{
min=lowcost[j];
k=j;
}
cout<<"边<"<<prevex[k]+1<<","<<k+1<<">的权为:"<<min<<endl;
lowcost[k]=0; //顶点k加入U
for(j=0;j<n;j++) //修改由顶点k到其他顶点边的权值
if(g[k][j]<lowcost[j])
{
lowcost[j]=g[k][j];
prevex[j]=k;
}
cout<<endl;
}
return 0;
} void main()
{
MGraph G;
int d,g[10][10];
d=CreatM(G);
for(int i=0;i<G.vexnum;++i)
for(int j=0;j<G.vexnum;++j)
g[i][j]=G.arcs[i][j].adj; //把邻接表换成邻接矩阵,从0算起
cout<<"最小生成树为:"<<endl;
Prim(g,G.vexnum,0);
cout<<"按以上最小生成树布线最省"<<endl;
}
这个程序用VC++编译连接好之后,Ctrl+F5可以成功运行exe,没有问题;但直接双击“Debug”文件夹中的exe程序却在生成最小生成树时出错。请问这是为什么啊?这两个操作有什么区别么?
#include <malloc.h>
#define INFINITY 10000typedef struct { //构造邻接矩阵
int adj; //权
char *mes; //信息
}ArcCell,AdjM[10][10]; typedef struct { //构造无向图
int vexs[10]; //顶点
AdjM arcs; //邻接矩阵
int vexnum,arcnum; //顶点数、边数
}MGraph; int LocVex(MGraph G,int v) //查找顶点V
{
int i=0;
while(G.vexs[i]!=v)
{
++i; //查找下一顶点
}
return i; //返回i
}int CreatM(MGraph &G) //创建图用邻接矩阵表示
{
int v1,v2;
int i,j,w;
cout<<"040808_赵博_信息安全"<<endl;
cout<<"最小生成树问题,用Prim算法解决.用10个顶点代表10台电脑"<<endl;
cout<<"输入图G的边数,按回车确定,注意:边数应该在9到45之间"<<endl;
cin>>G.arcnum;
G.vexnum=10;
for(i=0;i<G.vexnum;++i)
{
G.vexs[i]=i+1; //顶点编号从1开始
}
for(i=0;i<G.vexnum;++i)
{
for(j=0;j<G.vexnum;++j)
{
G.arcs[i][j].adj=INFINITY; //两点之间没有连线的话认为权为INFINITY
G.arcs[i][j].mes=NULL; //这时没有边的相关信息
}
}
for(int k=0;k<G.arcnum;++k)
{
cout<<"输入第"<<k+1<<"条边的起点、终点和权,用空格分开"<<endl;
cin>>v1>>v2>>w; //输入一条边依附的两点及权值
i=LocVex(G,v1); //确定顶点V1在图中的位置
j=LocVex(G,v2); //确定顶点V2在图中的位置
G.arcs[i][j].adj=w; //无向图
G.arcs[j][i].adj=w;
}
return G.vexnum;
}int Prim(int g[10][10],int n,int u) //本程序用Prim算法构造最小生成树,从顶点u开始构造
{
int lowcost[10]; //lowcost[]存储当前集合U分别到剩余结点的权值最小边
int prevex[10]; //prevex[]存储权值最小边在U中的结点
int i,j,k,min;
for(i=0;i<n;i++)
{
lowcost[i]=g[u][i]; //记录u到各个顶点的权(此处指布线花费)
prevex[i]=0; //顶点未加入到最小生成树中
}
lowcost[u]=0; //标志顶点1加入U集合
for(i=0;i<n-1;i++) //形成n-1条边的生成树
{
min=INFINITY;
k=0;
for(j=0;j<n;j++) //寻找满足边的一个顶点在U,另一个顶点在V的最小边
if((lowcost[j]<min) && (lowcost[j]!=0))
{
min=lowcost[j];
k=j;
}
cout<<"边<"<<prevex[k]+1<<","<<k+1<<">的权为:"<<min<<endl;
lowcost[k]=0; //顶点k加入U
for(j=0;j<n;j++) //修改由顶点k到其他顶点边的权值
if(g[k][j]<lowcost[j])
{
lowcost[j]=g[k][j];
prevex[j]=k;
}
cout<<endl;
}
return 0;
} void main()
{
MGraph G;
int d,g[10][10];
d=CreatM(G);
for(int i=0;i<G.vexnum;++i)
for(int j=0;j<G.vexnum;++j)
g[i][j]=G.arcs[i][j].adj; //把邻接表换成邻接矩阵,从0算起
cout<<"最小生成树为:"<<endl;
Prim(g,G.vexnum,0);
cout<<"按以上最小生成树布线最省"<<endl;
}
这个程序用VC++编译连接好之后,Ctrl+F5可以成功运行exe,没有问题;但直接双击“Debug”文件夹中的exe程序却在生成最小生成树时出错。请问这是为什么啊?这两个操作有什么区别么?
解决方案 »
- 线程内new对象指针,线程退出后,进程delete出错.
- listctrl高亮状态指示问题?
- 怎么让CScrollView的滚动条消失?
- 请问像联众游戏这样有很多游戏服务器,请问他们操作数据库是这样操作的?是每个服务器都有一个数据库,还是怎样的?
- 为什么运行时控件的大小和设计时不一样?
- 又一个莫名其妙的问题???
- vc打印问题?解决马上给分
- 简单问题:读出本程序虚拟内存中0x00400000的值
- 我用OPEN CV 自带的HARRTRAINING对样本进行学习后怎么检测?
- 编译出错???????
- 能不能把一个单文档的工程改成一个多文档视图的?
- 【求助+征友】OpenGL光照效果离现实太远,请教大侠,如果能成朋友更好,:)
1,两者的工作目录不一样,一个是debug,另一个是debug的上一级目录
2,ide里执行的控制台程序执行完都会暂停,等待你敲一个回车才退出。直接执行就不会
Release 可以 ...
如果有,DEBUG文件夹里也需要加入,否则无法直接运行DEBUG文件夹里的EXE