本文目录一览:
学校超市选址问题(带权有向图的中心点)----C 语言
这是最短路径问题
首先有向赋权图得用邻接表来表示。
不知道邻接表是怎么建的,所以随便鼓捣了一下。。
#include stdio.h
#include stdlib.h
#include string.h
#define alloc(type) (type*)malloc(sizeof(type))
#define MAX_NUM 3.14E38
#define TRUE 1
#define FALSE 0
#define NODE_NUM 8
struct adj_list{
int index;
char name[10];
float len;
struct adj_list *next;
};
typedef struct adj_list Node;
//node[]为起始节点数组
int dijkstra(Node node[],int size,int first,float distance[],int previous[]){
//初始化数组
int *isused=new int[size];
for(int i=0;isize;i++){
distance[i]=MAX_NUM;
isused[i]=FALSE;
previous[i]=-1;
}
//初始起始节点和邻接节点间的距离
Node *pos=node[first].next;
if(pos==NULL)
return 0;
while(pos!=NULL){
distance[pos-index]=pos-len;
previous[pos-index]=first;
pos=pos-next;
}
//初始化开头节点
distance[first]=0;
isused[first]=TRUE;
int current=first;
//这里不是对所有的起始节点进行遍历
for(i=1;isize;i++){
//寻找一个最近开头节点的节点
float temp=MAX_NUM;
for(int j=0;jsize;j++){
if(isused[j]==FALSEdistance[j]temp){
current=j;
temp=distance[j];
}
}
if(current==first) break;
isused[current]=TRUE;
//更新distance[]列表
pos=node[current].next;
while(pos!=NULL){
if(isused[pos-index]==FALSEdistance[pos-index]distance[current]+pos-len){
distance[pos-index]=distance[current]+pos-len;
previous[pos-index]=current;
}
pos=pos-next;
}
}
return current;
}
//追踪线路
void printTrace(int lastindex,Node node[],int previous[]){
printf("最短路径为:");
if(lastindex==0)
printf("%s",node[0].name);
else{
int pos=lastindex;
while(true){
printf("%s ",node[pos].name);
if(pos==0) break;
pos=previous[pos];
}
printf("\n");
}
}
void generate(Node node[],int size){
//先输入顶点名字,然后按格式输入后面的链表节点
//格式为:name index len
//输入#结束链表节点的输入,转入其他顶点
for(int i=0;isize;i++){
printf("%d\n",i);
scanf("%s",node[i].name);
node[i].len=0.0;
node[i].index=i;
node[i].next=NULL;
Node *pos=node[i];
char name[10];
int index=0;
float len=0.0;
while(true){
scanf("%s",name);
if(strcmp(name,"#")==0) break;
scanf("%d %f",index,len);
Node *no=alloc(Node);
strcpy(no-name,name);
no-index=index;
no-len=len;
no-next=NULL;
pos-next=no;
pos=pos-next;
}
}
}
void printnode(Node *node){
printf("(%d,%s,%g)",node-index,node-name,node-len);
}
void showtable(Node node[],int size){
for(int i=0;isize;i++){
printnode(node+i);
Node *pos=node[i].next;
while(pos!=NULL){
printf("-");
printnode(pos);
pos=pos-next;
}
printf("\n");
}
}
int main(){
Node node[NODE_NUM];
generate(node,NODE_NUM);
float distance[NODE_NUM];
int previous[NODE_NUM];
int lastindex=dijkstra(node,NODE_NUM,0,distance,previous);
printTrace(lastindex,node,previous);
return 0;
}
c语言的一个小问题
没必要那么复杂吧,其实只要分别求x和y的加权平均数就行了。读文本我省略了,直接储存成数据了。
#include stdio.h
#include stdlib.h
double X[8]={10,30,19,38,9,2,5,29};
double Y[8]={20,34,25,49.1,38.1,34,8};
int People[8]={30,45,28,8,36,16,78,56};
main()
{
double X_=0,Y_=0;
int i;
int PeopleCount=0;
for(i=0;i8;i++)
PeopleCount+=People[i];//总人数
for(i=0;i8;i++)
X_+=X[i]*People[i]/PeopleCount;//求x的加权平均数
for(i=0;i8;i++)
Y_+=Y[i]*People[i]/PeopleCount;//求y的加权平均数
printf("Best location:(%f,%f)",X_,Y_);
return 0;
}
程序运行后输出(16.350168,19.402020)
C语言中为新建医院选址问题
假设distance[i][j]存储了村庄之间的距离
定义int a[N];
a[i],假设在第i个村庄建立医院,那么最远村庄到该医院的距离。
for(i=0; iN; i++){//假设在第i个村庄建立医院
a[i] = 0;
for(j=0;jN; j++)
if(a[i]distance[i][j]) a[i]=distance[i][j];//寻找最远村庄,将最远距离保存到a[i]
}
//在a数组中寻找最小值。
for(i=0; iN; i++){
//略
}
//最小值对应的下标就是村庄。
//略。输出。
C语言数据结构 超市选址
【程序的设计要求】
要提供程序测试方案,程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
【学生的培养要求】
你自己的能力,也要经得起测试,这个题就是测试你能力的,明显你的能力不行,通不过嘛
通不过就通不过,宁可学的知识少一些,也要注重自己的品德,没能力又没品德,靠抄袭,就算做出来,也是没有意义的