14 计专

给定连通图G和G中的一个结点v,求G的支撑树T,并使其满足如下两个条件:1.T的根是v;2.T的层次遍历序列恰好是以v为起点的G的某个广度优先遍历次序。
思路:是支撑树,不是最小支撑树,只需要把所有节点按广度优先顺序加入树中就行。
1.创建一棵树的结构,可以有maxsize个子树,采用广度优先搜索。
2.初始化队列,将根结点入队,同时开始循环,若当前节点未被访问,则执行一次广度优先搜索。
3.当前节点未被遍历时,将其邻接的所有顶点作为子树,对它们进行标记,入队。

typedef struct node
{
	int data;
	struct node *child[maxsize];//一个结点可能有不止两个邻接点
}*Node;
typedef struct arcnode
{
	int adjvex;
	struct arcnode *next;
}*Arcnode;
typedef struct Vnode
{
	int data;
	Arcnode firstnode;
}Vnode;
typedef struct graph
{
	Vnode edges[maxsize];
	int n,e;
}*graph;
Arcnode FistNeighbor(graph G,Node p)
{
	return G->edges[p->data].firstnode;
}
Arcnode NextNeighbor(graph G,Node p,Arcnode q)
{
	Arcnode t=G->edges[p->data].firstnode;
	while(t!=NULL)
	{
		if(t->adjvex!=q->adjvex)
			t=t->next;
		else
			break;
	}
	return t->next;
}
Node getTree(graph g,int v)//按广度优先遍历生成一个支撑树
{
	Node queue[maxsize];
	Node root=(Node)malloc(sizeof(struct node));
	root->data=v;
	int visited[maxsize]={0};
	visited[v]=1;
	int front=0,rear=0;
	queue[rear++]=root;//入队
	Node p;
	while(front!=rear)
	{
		p=queue[front++];//出队
		int i=0;
		for(Arcnode q=FistNeighbor(g,p);q!=NULL;q=NextNeighbor(g,p,q))//遍历p的所有邻接顶点
		{
			if(visited[q->adjvex]==0)
			{
				p->child[i]=(Node)malloc(sizeof(struct node));  //将邻接顶点转换成树节点
				p->child[i]->data=q->adjvex;
				visited[q->adjvex]=1; //标记访问
				queue[rear++]=p->child[i]; //入队
				i++;

			}
		}
	}
	return root;//返回支撑树
}

二分法求根。连续函数f(x)=x3-x2-1在【0,3】有且只有一个实根。利用二分法求该实根的近似值。要求结果精确到10-4

double f(double x)
{
	return x*x*x-x*x-1;
}
void main()
{
	double a=0,b=3;
	double x=1.5;
	while(fabs(f(x))>1e-4)
	{
		if(f(x)*f(a)>0)//如果x与左界限同号,则左界限更新为x
		{
			a=x;
		}
		else
		{
			b=x;  
		}
		x=(a+b)/2;
	}
	printf("%lf\n",x);
}

对数组中数值不同的数据各自出现的频率进行统计并输出。

#define n 10
void fun(int a[])
{
	int visit[n]={0};
	for(int i=0;i<n;i++)
	{
		if(visit[i]==0)//当前元素未访问过
		{
			visit[i]=1;
			int sum=1;
			for(int j=i+1;j<n;j++)//统计其相同的元素
			{
				if(a[j]==a[i]&&visit[j]==0)
				{
					visit[j]=1;
					sum++;
				}
			}
			printf("%d 出现的次数是 %d\n",a[i],sum);
		}
		
	}
}

在大于1的自然数中,除了1和自身外,不能被其它自然数整除的自然数称为质数。编写完整程序,该程序的功能是:输入一个整数n,若n<2,则输出0;若n是质数,则输出n的值,否则,输出n的质因子分解式,例如:
若n=1,则输出0
若n=13,则输出13
若n=6,则输出6=23
若n=8,则输出8=2
2*2

void main()
{
	int n,i;
	scanf("%d",&n);
	if(n<2)printf("0");
	else 
	{
		int flag=1;//1表示是质数,0表示不是质数
		for(i=2;i*i<=n;i++)
		{
			if(n%i==0)
			{
				flag=0;
				break;
			}
		}
		if(flag==1)printf("%d",n);
		else
		{
			printf("%d=%d",n,i);
			n=n/i;
			for(int j=2;j<=n;j++)
			{
				if(n%j==0)
				{
					while(n%j==0)
					{
						printf("*%d",j);
						n=n/j;
					}
				}
			}
			
		}
	}
}

在这里插入图片描述

void main()
{
	int a[10][10];
	int i,j;
	int n=1;
    for(int k=0;k<10;k++)
	{
		i=k;  //从每行第一个开始斜向上赋值,从k行到0行
		j=0;
		while(i>=0)
		{
			a[i--][j++]=n++;
		}
	}
	for(int k=1;k<10;k++)
	{
		i=9;j=k;  //从最后一行第二列开始,依次斜向上到第最后一列。
		while(j<10)
		{
			a[i--][j++]=n++;//斜上方赋值
		}
	}
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
			printf("%3d ",a[i][j]);
		printf("\n");
	}
		

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值