You are on page 1of 13

XX

XXXXXXXXXXXXXXXX
XXX
XXX
2011-6-2 9

1
10

2
22
1
2
3
4

1



2

1
23

1
2
3.
4.
5.
6.
2
#include<iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define Max 32767
#define NUM 11
typedef struct ArcCell{
int adj; //
char *info;
}ArcCell; //
typedef struct VertexType{
int number; //
char *sight; //
char *description; //
}VertexType; //
typedef struct{
VertexType vex[NUM]; //
ArcCell arcs[NUM][NUM]; //
int vexnum,arcnum; //
}MGraph; //
MGraph G; //
int P[NUM][NUM]; // //
long int D[NUM]; //
int x[13]={0};
void CreateUDN(int v,int a); //
void pingmu(); //
void introduce();
void ShortestPath(int num); //
void output(int sight1,int sight2); //
void PrintMGraph();
char Menu(); //
void search(); ;//
char SearchMenu(); //
void HaMiTonian(int); //
void NextValue(int);
void display(); //
void main() //
{ int v0,v1;
char ck;
system("color 0");
CreateUDN(NUM,11);
do{
ck=Menu();
switch(ck){
case'1':
introduce();
printf("\n\n\t\t\t%-25s\n\n",G.vex[0].description);
getchar();
getchar();
break;
case '2':
system("cls");
pingmu();
printf("\n\n\t\t\t 110");
scanf("%d",&v0);
printf("\t\t\t 110");
scanf("%d",&v1);
ShortestPath(v0); //
output(v0,v1); //
printf("\n\n\t\t\t\t ...\n");
getchar();
getchar();
break;
case '3':search();
break;
case '4':
system("cls");
pingmu();
x[0]=1;
HaMiTonian(1);
printf("\n\n\t\t\t\t ...\n");
getchar();
getchar();
break;
case'5':
PrintMGraph();
printf("\n\n\t\t\t\t ...\n");
getchar();
getchar();
break;};
}while(ck!='e');}
char Menu() // //{
char c;
int flag;
do{
flag=1;
system("cls");
pingmu();
introduce();
printf("\n\t\t\n");
printf("\t\t \n");
printf("\t\t 1. \n");
printf("\t\t 2. \n");
printf("\t\t 3. \n");
printf("\t\t 4. \n");
printf("\t\t 5. \n");
printf("\t\t e. \n");
printf("\t\t \n");
printf("\t\t\n");
printf("\t\t\t\t ");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='e')
flag=0;
}while(flag);
return c;}
char SearchMenu() // {
char c;
int flag;
do{
flag=1;
system("cls");
pingmu();
introduce();
printf("\n\t\t\n");
printf("\t\t \n");
printf("\t\t 1 \n");
printf("\t\t 2 \n");
printf("\t\t e \n");
printf("\t\t \n");
printf("\t\t \n");
printf("\t\t\t ");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
return c;}
void search() // {
int num;
int i;
char c;
char name[20];
do{
system("cls");
c=SearchMenu();
switch (c){
case '1':
system("cls");
introduce();
pingmu();
printf("\n\n\t\t ");
scanf("%d",&num);
for(i=0;i<NUM;i++){
if(num==G.vex[i].number){
printf("\n\n\t\t\t :");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t ...");
getchar();
getchar();
break;}}
if(i==NUM){
printf("\n\n\t\t\t ");
printf("\n\n\t\t\t ...");
getchar();
getchar();}
break;
case '2':
system("cls");
pingmu();
introduce();
printf("\n\n\t\t ");
scanf("%s",name);
for(i=1;i<NUM;i++){
if(!strcmp(name,
G.vex[i].sight)){
printf("\n\n\t\t\t :");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t ...");
getchar();
getchar();
break;}}
if(i==NUM){
printf("\n\n\t\t\t ");
printf("\n\n\t\t\t ...");
getchar();
getchar();}
break;}
}while(c!='e');}
void CreateUDN(int v,int a) // {
int i,j;
G.vexnum=v; //
G.arcnum=a;
for(i=1;i<G.vexnum;++i) G.vex[i].number=i; //
//
G.vex[0].sight="";
G.vex[1].sight="";
G.vex[2].sight="";
G.vex[3].sight="";
G.vex[4].sight="";
G.vex[5].sight="";
G.vex[6].sight="";
G.vex[7].sight="";
G.vex[8].sight="";
G.vex[9].sight="";
G.vex[10].sight="";
// 32767
for(i=1;i<G.vexnum;++i){
for(j=1;j<G.vexnum;++j) {
G.arcs[i][j].adj=Max;
G.arcs[i][j].info=NULL;}}
//
//
G.arcs[1][4].adj=G.arcs[4][1].adj=1000;
G.arcs[1][3].adj=G.arcs[3][1].adj=1500;
G.arcs[3][5].adj=G.arcs[5][3].adj=800;
G.arcs[3][10].adj=G.arcs[10][3].adj=600;
G.arcs[4][6].adj=G.arcs[6][4].adj=500;
G.arcs[2][5].adj=G.arcs[5][2].adj=1000;
G.arcs[2][4].adj=G.arcs[4][2].adj=500;
G.arcs[5][7].adj=G.arcs[7][5].adj=450;
G.arcs[4][6].adj=G.arcs[6][4].adj=350;
G.arcs[4][7].adj=G.arcs[7][4].adj=250;
G.arcs[6][8].adj=G.arcs[8][6].adj=250;
G.arcs[7][8].adj=G.arcs[8][7].adj=200;
G.arcs[6][9].adj=G.arcs[9][6].adj=400;}
//
void PrintMGraph(){
int i,j;
cout<<"\n
====================================================================\n\n ";
for(i=1;i<G.vexnum;++i){
cout<<G.vex[i].sight<<" ";}
cout<<endl;
for(i=1;i<G.vexnum;++i){
cout<<"\n\n"<<G.vex[i].sight<<" ";
for(j=1;j<G.vexnum;++j){
if(G.arcs[i][j].adj==Max)
cout<<" no ";
else
cout<<" "<<G.arcs[i][j].adj;}}
cout<<"\n\n\n\n===================================================\n\n\n";}
void introduce() // {
int i;
for(i=1;i<=NUM;i++){
G.vex[0].description="
";
G.vex[1].description=" ";
G.vex[2].description="";
G.vex[3].description=" ";
G.vex[4].description=" ";
G.vex[5].description="";
G.vex[6].description="";
G.vex[7].description=" ";
G.vex[8].description=" ";
G.vex[9].description="";
G.vex[10].description="";}}
void pingmu() // {
int i;
printf("\n\n\t\t*****************************\n\n");
printf("\t\t\n");
printf("\t\t\t\t \t\t\n",1,1);
printf("\t\t\n");
printf("\t\t\t\t \t\t\n",6,6);
printf("\t\t\n");
for(i=1;i<NUM;i++){
printf("\t\t%c\t\t(%2d)%-20s%c\t\t\t",1,i,G.vex[i].sight,1); // }
printf("\t\t\n\n");}
void ShortestPath(int num) // num {
int v,w,i,t; // iw v
int final[NUM];
int min;
for(v=1;v<NUM;v++){
final[v]=0; // num v
D[v]=G.arcs[num][v].adj;// D
for(w=1;w<NUM;w++) //
P[v][w]=0;
if(D[v]<32767) // {
P[v][num]=1; //
P[v][v]=1; // }}
D[num]=0;
final[num]=1; // num S
// num S
for(i=1;i<NUM;++i) // G.vexnum-1 {
min=Max; // num
for(w=1;w<NUM;++w)
if(!final[w]) // w v-s
if(D[w]<min) // w num {
v=w;
min=D[w];}
final[v]=1; // num v s
for(w=1;w<NUM;++w) //
if(!final[w]&&((min+G.arcs[v][w].adj)<D[w]))// s
//{
D[w]=min+G.arcs[v][w].adj;
for(t=0;t<NUM;t++)
P[w][t]=P[v][t];
P[w][w]=1;}}}
void output(int sight1,int sight2) // {
int a,b,c,d,q=0;
a=sight2; // a
if(a!=sight1) // ... {
printf("\n\t %s %s ",G.vex[sight1].sight,G.vex[sight2].sight);//
printf("\t( %dm.)\n\n\t",D[a]); // sight1 sight2 D[]

printf("\t%s",G.vex[sight1].sight); //
d=sight1; // d
for(c=0;c<NUM;++c){
gate:; // goto
P[a][sight1]=0;
for(b=0;b<NUM;b++){
if(G.arcs[d][b].adj<32767&&P[a][b]) //
{
printf("-->%s",G.vex[b].sight); //
q=q+1; // 8
P[a][b]=0;
d=b; // b
if(q%8==0) printf("\n");
goto gate;}}}}}
void HaMiTonian(int m) // {
if(m>8) return;
L: NextValue(m);
if(x[m]==0)
return;
if(m==7&&G.arcs[1][x[8]-1].adj!=32767)
display();
else
HaMiTonian(m+1);
goto L; }
void NextValue(int k) { int j;
l:x[k]=(x[k]+1)%10;
if(x[k]==0)
return;
if(G.arcs[x[k-1]-1][x[k]-1].adj!=32767) {
for(j=0;j<k;j++)
if(x[j]==x[k])
goto l;
return; }
else
goto l; }
void display() { int i=1;
printf("\n\n\t");
for(i=1;i<8;i++)
printf("%s->",G.vex[x[i]-1].sight);
printf("");
printf("\n");}

10% 35% 20% 20% 10% 5%

You might also like