求c语言编程,要有运行结果,谢谢

如题所述

#include<iostream.h>
#include<stdlib.h>
#include<malloc.h>

#define max 20

typedef struct node //定义AOV网的邻接链表的边结点结构 有向图
{
int vex; //边结点
struct node *next; //边结点的指针
}edgenode;

typedef struct vnode //定义AOV网的邻接链表的边结点结构 有向图
{
int id; //入度
struct node *link; //顶点的指针
}vexnode;

typedef struct nodel //定义AOE网的邻接链表的边结点结构
{
int adgvex; //边结点
int dut; //权值
struct nodel *next;//边结点指针
}edgenodel;

typedef struct vnodel //定义AOE网的邻接链表的边结点结构
{
int vertex; //顶点
int id; //入度
struct nodel *link;//顶点的指针
}vexnodel;

int na;
//函数的申明
int creatAOE(vexnodel dig[]);
int creatAOV(vexnode dig[]);
void toposort(vexnode dig[],int n);
void criticalpath(vexnodel dig[],int n);

void main()
{
vexnodel dig[max]; //AOV的顶点数组
vexnode dig2[max]; //AOE的顶点数组

int n=0;
int cord=1;

while(1)
{
cout<<"----主菜单----"<<endl;
cout<<"1.建立AOV邻接链表"<<endl;
cout<<"2.建立AOE邻接链表"<<endl;
cout<<"3.拓扑排序"<<endl;
cout<<"4.求关键路径"<<endl;
cout<<"0.退出"<<endl;
cout<<"输入你的选择:"<<endl;

cin>>cord;
switch(cord)
{
case 1:n=creatAOV(dig2);
break;
case 2:cout<<"输入边数:";
cin>>na; //AOE网的活动数
n=creatAOE(dig);
break;
case 3:toposort(dig2,n);
break;
case 4:criticalpath(dig,n); //求关键路径
break;
case 0:exit(0);
}
}
}

int creatAOE(vexnodel dig[])
{
int vextotal,j,a,b,c;
edgenodel *p;
cout<<"输入顶点数:";
cin>>vextotal; //输入顶点数
for(j=0;j<max;j++) //输入AOE邻接链表
{
dig[j].vertex=j; //初始化顶点数组
dig[j].id=0;
dig[j].link=NULL; //顶点的指针
}

for(j=1;j<=na;j++)
{
cout<<"输入边<i j>以及权值:";
cin>>a>>b>>c; //a为始顶点,b为终顶点,c为活动的权
dig[b].id++; //入度加一
p=(edgenodel*)malloc(sizeof(edgenodel));
p->adgvex=b;
p->dut=c;
p->next=dig[a].link;
dig[a].link=p;
}
cout<<"输出邻接表"<<endl;
//输入AOV图的邻接链表
for(j=1;j<=vextotal;j++)
{
cout<<"顶点"<<j<<"入度为"<<dig[j].id<<"指向:";
p=dig[j].link; //顶点指针下移
while(p!=0)
{
cout<<"顶点"<<p->adgvex<<"权值为"<<p->dut<<" ";
p=p->next;
}
cout<<endl;
}
return vextotal;
}

int creatAOV(vexnode dig[])
{
int vextotal,arcnumber,j,a,b;
edgenode *p; //边结点结构

cout<<"输入边数:";
cin>>arcnumber;
cout<<"输入顶点数:";
cin>>vextotal;

//输入AOV图的邻接链表
for(j=0;j<max;j++) //初始化
{
dig[j].id=0;
dig[j].link=NULL; //顶点指针为空
}

for(j=1;j<=arcnumber;j++)
{
cout<<"输入两个顶点表示的边:"<<endl;
cin>>a>>b; //输入边信息,a为始顶点,b为终顶点
p=(edgenode*)malloc(sizeof(edgenode));
p->vex=b;
p->next=dig[a].link;
dig[a].link=p;
dig[b].id++; // 入度加1
}

cout<<"输出邻接表"<<endl; //输入AOV图的邻接链表
for(j=1;j<=vextotal;j++)
{
cout<<"顶点"<<j<<"入度"<<dig[j].id<<"邻接";
p=dig[j].link; //指针下移
while(p!=NULL)
{
cout<<"顶点"<<p->vex<<" ";
p=p->next;
}
cout<<endl;
}
return vextotal;
}

void toposort(vexnode dig[],int n) //拓扑排序
{
edgenode *p;
int i,j,k,top,m;
top=0;
m=0;
// cout<<"ssss"<<n;
for(i=1;i<=n;i++)
if(dig[i].id==0) //把入度为0的顶点链成链
{
dig[i].id=top;
top=i;
}

while(top>0)
{
j=top;
top=dig[top].id;
cout<<j<<" "; //输出入度为0的顶点
m++; // 计算入度为零的顶点
p=dig[j].link;

while(p!=NULL)
{
k=p->vex;
dig[k].id--;
if(dig[k].id==0)
{
dig[k].id=top;
top=k;
}
p=p->next;
}
}
cout<<endl;
if(m<n)
cout<<"the network has acycle"<<endl;
}

void criticalpath(vexnodel dig[],int n) //求关键路径
{
//ve和vl是顶点事件的最早和最晚时间
//e 和l 是活动的最早和最晚时间
int front=0,rear=0;
int tpord[20],vl[20],ve[20];
int l[20],e[20],i,j,k,m;
edgenodel *p;

for(i=1;i<=n;i++)
ve[i]=0; //把时间的最早发生时间赋初值

for(i=1;i<=n;i++) // 把入度为0的全部入队
if(dig[i].id==0)
tpord[++rear]=i;

m=0;
while(front!=rear)
{
front++;
j=tpord[front];
m++; // 用来判断有无有向环的
p=dig[j].link; //指针下移

while(p)
{
k=p->adgvex;
dig[k].id--; //顶点的入度减1
if(ve[j]+p->dut>ve[k]) //最早时间取最大值,ve[]初始为0,如果有多条则比较
ve[k]=ve[j]+p->dut;

if(dig[k].id==0)
tpord[++rear]=k;
p=p->next;
}
}

if(m<n) //判断有没有有向环
cout<<"the AOE network has acycle"<<endl;

for(i=1;i<=n;i++) // 对时间最晚发生时间赋初值
vl[i]=ve[n];

for(i=n-1;i>=1;i--) // 计算最晚发生时间
{
j=tpord[i];
p=dig[j].link; //求vl[]数组的值
while(p)
{
k=p->adgvex;
if((vl[k]-p->dut)<vl[j]) //最晚时间去最小值或初始值
vl[j]=vl[k]-p->dut;
p=p->next;
}
}

cout<<"输出最早和最晚时间"<<endl; //输出每个事件的最早发生时间和最晚发生时间
for(i=1;i<=n;i++)
cout<<"最早"<<ve[i]<<"最晚"<<vl[i]<<endl;

for(j=1,i=1;j<=n;j++,i++) //计算活动的最早发生时间和最晚发生时间
{
p=dig[j].link;
while(p)
{
k=p->adgvex;
e[i]=ve[j];
l[i]=vl[k]-p->dut;
cout<<"顶点"<<dig[j].vertex<<"顶点"<<dig[k].vertex<<"最早"<<e[i]<<"最晚"<<l[i]<<"可推迟时间"<<l[i]-e[i];
if(l[i]==e[i])
cout<<"是关键活动"<<endl;
else
cout<<endl;
p=p->next;
}
}
cout<<"关键路径:";
for(j=1,i=1;j<=n;j++,i++) //计算活动的最早发生时间和最晚发生时间
{
p=dig[j].link;
while(p)
{
k=p->adgvex;
e[i]=ve[j];
l[i]=vl[k]-p->dut;
if(l[i]==e[i])
cout<<dig[i].vertex<<" ";
p=p->next;
}
}
cout<<n;
cout<<endl;
}

测试数据
12
9
1 2 4
1 3 2
1 4 5
2 5 2
2 8 6
3 5 5
4 6 4
5 6 3
5 7 2
6 7 4
7 9 5
8 9 3
12
9
1 2
1 3
1 4
2 5
2 8
3 5
4 6
5 6
5 7
6 7
7 9
8 9
很简单的可以自己运行
可以追问我追问

没看明白,怎样得到题目的结果

追答

这是一个利用图求工程关键路径和拓扑排序的图实验,两个点表示一条边,如果是三个的话最后一个就是他们的权值

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-22

程序为任意输入两数的阶乘和。

如输入8 11

则为  8!+9!+10!+11!

第2个回答  2011-11-21
#include<stdio.h>
#define N 4
main()
{
double A[N][N]={{2,1,0,0},{2,4,2,0},{0,3,5,1},{0,0,6,7}},b[N]={2,-1,3,2};
int i;
A[0][1]=A[0][1]/A[0][0];
for(i=1;i<N-1;i++)
A[i][i+1]=A[i][i+1]/(A[i][i]-A[i][i-1]*A[i-1][i]);
for(i=1;i<N;i++)
A[i][i]=A[i][i]-A[i][i-1]*A[i-1][i];
b[0]=b[0]/A[0][0];
for(i=1;i<N;i++)
b[i]=(b[i]-A[i][i-1]*b[i-1])/A[i][i];
for(i=N-2;i>=0;i--)
b[i]=b[i]-A[i][i+1]*b[i+1];
for(i=0;i<N;i++)
printf("%.6lf ",b[i]);
}
你看看对不对追问

能不能把运行结果发给我,发到邮箱吧,609805445@qq.com拜托了,拜托了

追答

刚刚发了

本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网