头文件包含过多了,有些没有用到,先从m1.txt和m2.txt读取数据,其中m1.txt存的是图,及弧的权 #include <stdio.h> #include<fstream> #include<string> #include<algorithm> #include<stdlib.h> #include<math.h> #include<list> #include<queue> #include"graph.h" using namespace std; #define MAX 6 void main() { int m1[MAX][MAX]; int m2[MAX][MAX]; ifstream fp1("F://课件//算法设计与分析//作业//Assignment_2//assignment2//m1.txt"); //打开城市之间是否连通的矩阵文件 ifstream fp2("F://课件//算法设计与分析//作业//Assignment_2//assignment2//m2.txt"); //打开城市之间养路费的矩阵文件 string sline; if(fp1 == NULL || fp2 == NULL){ printf("cannot open m1.txt and m2.txt"); exit(0); } //如果文件不存在 int i,j; for(i=0;i<MAX;i++){ for(j=0;j<MAX;j++) { //getline(fp1,sline,' '); //m1[i][j]=atoi(sline.c_str()); fp1>>m1[i][j]; } }//从m1.txt文件中读取矩阵,并存入二维数组m1中 for(i=0;i<MAX;i++){ for(j=0;j<MAX;j++) { //getline(fp2,sline,' '); //m2[i][j]=atoi(sline.c_str()); fp2>>m2[i][j]; } }//从m2.txt文件中读取矩阵,并存入二维数组m2中 printf("%d %d/n",m1[1][5],m1[1][6]); fp1.close(); fp2.close(); /* 将用矩阵表示的图转换成用邻接表表示的图 */ Graph *graph ; graph = new Graph; bool firstflag = false; for(i=0;i<MAX;i++) graph->List[i].first = NULL;//给邻接表表示的图的所有头结点的指针域置初值 for(i=0;i<MAX;i++)//检查邻接矩阵中的每个元素 { graph->List[i].x=i;//设置邻接表的顶点值 graph->List[i].pre = -1; Node *temp; for(j=MAX-1;j>=0;j--) { if(m1[i][j] < 9999 )//邻接矩阵当前元素小于9999 { temp=(Node*)malloc(sizeof(Node));//创建一个Node结点 temp->x = j; temp->dist=m1[i][j]; temp->cost=m2[i][j]; temp->next=graph->List[i].first;//将*temp链到链表后 graph->List[i].first = temp; } } } /* 测试邻接矩阵的转换是否成功 */ for(i=0;i<MAX;i++) { printf("graph %d ",graph->List[i].x); if(graph->List[i].first != NULL){ Node* t = graph->List[i].first; printf("->%d(%d)",t->x,t->dist); while(t->next != NULL){ printf("->%d(%d)",t->next->x,t->next->dist); t=t->next; } } printf("/n"); } } 下边是定义的图的存储结构,只是邻接表的形式 #define MAX 6 class Node { public: int x;//结点的值,也就是城市的序号 class Node *next;//下一个结点,与顶点相连的下一个结点 int dist;//顶点到结点n的路径长度 int cost;//顶点到结点n的养路费 }; class VNode { public: int pre;//用于记录路径 int x;//顶点的值,就是城市的序号 class Node *first;//邻接表的第一个结点,也就是与n相连的结点 //int dist;//n到first结点的路径长度 //int cost;//n到first结点的养路费 }; class Graph { public: class VNode List[MAX]; }; class List { public: int city; class List *next; }; class Path { public: int x;//节点下标 int pdist;//当前源点到x的路径长度 int pcost;//当前源点到x的花费 friend bool operator < (Path a, Path b) { if(a.pdist != b.pdist) return a.pdist > b.pdist;//距离小的优先级高 return a.pcost > b.pcost;//距离相等时,花费小的优先级高 } };