实验:图的应用

算法1:输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历结果。

实验源代码
#include <stdio.h>   
#include <stdlib.h>
#define OVERFLOW -2         
#define ILLEGAL -1         
#define OK 1                
#define ERROR 0
#define MAXQSIZE 100       
typedef int QElemType;
typedef int Status;       
typedef float ElemType;
#define INFINITY        65535    
#define MAX_VERTEX_NUM  20//最大顶点个数
typedef enum {DG,UDG} GraphKind;//(有向图,无向图)
typedef int VRType;
typedef int VertexType;
typedef struct ArcCell{
VRType   adj; 
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 
typedef struct{
VertexType vexs[MAX_VERTEX_NUM];//顶点向量
AdjMatrix  arcs;//邻接矩阵
int vexnum,arcnum;//图当前的定点数和弧数
GraphKind  kind;     
}MGraph; 
int LocateVex(MGraph G, int v){  
for(int i=0;i<=G.vexnum;++i)
if(G.vexs[i]==v)  
return i;   
return -1;  
}
Status CreateDG(MGraph &G){
//采用数组(邻接矩阵)表示法,构造有向图G 
VertexType v1,v2;
int i,j;
printf("请依次输入有向图G的顶点数,弧数,用空格隔开\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请依次输入有向图G的顶点名称,用空格隔开\n"); 
for(int i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);  
for(int i=0;i<G.vexnum;++i)
    for(int j=0;j<G.vexnum;++j)
      G.arcs[i][j].adj=0; 
printf("请依次输入有向图G每条弧依附的两顶点名称,输完一组按回车\n"); 
for(int k=0;k<G.arcnum;++k){ 
scanf("%d",&v1);
scanf("%d",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);    
G.arcs[i][j].adj=1;
}
return OK; 
}
Status CreateUDG(MGraph &G){
//采用数组(邻接矩阵)表示法,构造无向图G 
VertexType v1,v2;
int i,j;
printf("请依次输入无向图G的顶点数,弧数,用空格隔开\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请依次输入无向图G的顶点名称,用空格隔开\n"); 
for(int i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);   
for(int i=0;i<G.vexnum;++i)
for(int j=0;j<G.vexnum;++j)  
G.arcs[i][j].adj=0; 
printf("请依次输入无向图G每条弧依附的两顶点名称,输完一组按回车\n"); 
for(int k=0;k<G.arcnum;++k){  
scanf("%d",&v1);
scanf("%d",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);      
G.arcs[i][j].adj=1;
G.arcs[j][i]=G.arcs[i][j];  
}
return OK; 
}
Status CreateGraph(MGraph &G){  
//采用数组(邻接矩阵)表示法,构造图G
printf("请输入您想构造的图的类型:有向图,无向图,分别对应0,1");
int temp; 
scanf("%d",&temp);  
G.kind=(GraphKind)temp;
switch((GraphKind)temp){
case  DG:  return CreateDG(G);  
case UDG:  return CreateUDG(G);
default:  return ERROR;
} 
}
Status PrintAdjMatrix(MGraph G){  
//采用数组(邻接矩阵)表示法,构造图G
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++)
printf(" %3d ", G.arcs[i][j].adj);
printf("\n\n");
}  
}
int FirstAdjVex(MGraph G,VertexType v){
//求顶点v在图G中的第一个邻接点
int i,j=0,k;
k=LocateVex(G,v); 
for(i=0;i<G.vexnum;++i)
if(G.arcs[k][i].adj!=j)
return i;        
return -1;             
}
int NextAdjVex(MGraph G,VertexType v,VertexType w){ 
int i,j=0,k1,k2;
k1=LocateVex(G,v);  
k2=LocateVex(G,w);  
for(i=k2+1;i<G.vexnum;++i)
if(G.arcs[k1][i].adj!=j)
return i;       
return -1;            
}
typedef enum { TRUE=1 , FALSE=0 } Boolean; 
Boolean visited[MAX_VERTEX_NUM];    
Status (*VisitFunc)(int v);        
Status Print(int v){  
printf("%3d",v);
return OK;
}
void DFSTraverse(MGraph G,Status (*Visit)(int v)){
//对图G作深度优先遍历
void DFS(MGraph G,int v);   
VisitFunc=Visit;         
for(int v=0;v<G.vexnum;++v)
visited[v]=FALSE;    
for(int v=0;v<G.vexnum;++v)
if(!visited[v])   
DFS(G,v); 
}
void DFS(MGraph G,int v){
//从第v个顶点出发递归地深度优先遍历图G
visited[v]=TRUE;    
VisitFunc(G.vexs[v]);   
for(int w=FirstAdjVex(G,G.vexs[v]);w>=0;w=NextAdjVex(G,G.vexs[v],G.vexs[w])){
if(!visited[w])
DFS(G,w);    
}
}
typedef struct              
{
QElemType *base;        
int front;              
int rear;              
}SqQueue; 
Status InitQueue_Sq(SqQueue &Q) 
{   
if(!(Q.base=(QElemType *)malloc(sizeof(QElemType)))){
printf("内存分配失败,程序即将退出!\n");
exit(OVERFLOW);
}
Q.front=Q.rear=0;
return OK;
}
Status DestoryQueue_Sq(SqQueue &Q)
{   
free(Q.base); 
Q.base=NULL;
printf("循环队列已成功销毁!\n");
return OK;
}
Status QueueEmpty_Sq(SqQueue Q)
{  
if(Q.rear==Q.front) 
return OK; 
else
return ERROR; 
}
Status EnQueue_Sq(SqQueue &Q,QElemType e)
{   
if((Q.rear+1)%MAXQSIZE==Q.front)  
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;   
return OK; 
}
Status DeQueue_Sq(SqQueue &Q,QElemType &e)
{   
if(Q.front==Q.rear) 
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;  
return OK; 
} 
void BFSTraverse(MGraph G,Status (*Visit)(int v)){
//按广度优先非递归遍历图G,
SqQueue Q; 
for(int v=0;v<G.vexnum;++v)
visited[v]=FALSE;    
InitQueue_Sq(Q);          
for(int v=0;v<G.vexnum;++v)
if(!visited[v]){        
visited[v]=TRUE;  
Visit(G.vexs[v]);   
EnQueue_Sq(Q,v);    
while(!QueueEmpty_Sq(Q)){    
DeQueue_Sq(Q,v);      
for(int w=FirstAdjVex(G,G.vexs[v]);w>=0;w=NextAdjVex(G,G.vexs[v],G.vexs[w])){ 
        if(!visited[w]){   
           visited[w]=TRUE;  
                Visit(G.vexs[w]);    
      }
    } 
   }
  }
}
int main(int argc,char *argv[]){
MGraph G; 
CreateGraph(G);      
printf(" 图的邻接矩阵:\n\n"); 
PrintAdjMatrix(G);   
printf("图的遍历:\n");
printf("深度优先遍历结果:");
DFSTraverse(G,Print);
printf("\n广度优先遍历结果:");
BFSTraverse(G,Print); 
return 0;
} 

在这里插入图片描述

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
中断对个人生产力有复杂的影响。 它们可以缓解疲劳和痛苦,但也会干扰一个人的注意力和注意力。 近年来,组织和个人采取了许多策略来减少侵入数字中断的潜在负面影响。 我们调查了使用此类策略(特别是减少某些数字中断的数字应用程序)如何影响个人在随机现场实验中的表现。 我们在众包平台上利用在线员工的经济激励,捕捉他们在各种任务中的表现。 我们测量了相对于对照组的两种替代疗法的影响:i) 外源性疗法,其中应用程序被用来在固定时间段内阻止对选定在线服务(一些流行的社交媒体网站)的访问; ii) 一种内生性处理,参与者决定是否以及在多大程度上使用该应用程序来阻止访问在线服务。 在外生条件下,减少对某些在线服务的访问显着提高了个人的表现:参与者完成了约 35% 的任务(每小时),导致每小时收入增加约 26%。 我们发现了治疗的异质效应的证据:对于重度社交媒体用户来说,应用程序带来的性能提升较低; 在研究期间,这些参与者更有可能体验到挫败感和技术焦虑感的增加,这与社交媒体网站的强加封锁有关。 在内源性条件下,只有大约 36% 的参与者使用该应用程序的时间很长。 因此,虽然平均而言,该组的表现没有发生显着变化,但我们发现有证据表明,对确实使用该应用程序的参与者产生了积极影响,增加了应用程序使用分钟数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cai-4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值