给定连通图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=22*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");
}
}