文章
11
粉丝
152
获赞
45
访问
39.3k
首先这个题目按照题意是不能用floyd算法的,因为点的个数最大为1000,而floyd算法的复杂度为n*n*n,如果正式上机会超时。
既然已经决定要用迪杰斯特拉算法,那么首先考虑存储方式,这个题目即可以邻接链表,也可以邻接矩阵。
邻接矩阵法:
- #include<stdio.h>
- #define N 1001
- #define MAX 110000000
- int dis[N][N]; //表示距离的邻接矩阵
- int cost[N][N]; //表示花费的邻接矩阵
- int adis[N]; //单点到其他点的距离最小值
- int acost[N]; //在距离最小的前提下的花费最小值
- bool mark[N]; //是否已经在集合中
- void init(int n) //初始化各数组
- {
- for(int i=1;i<=n;i++) //将距离和花费均设为不可达 即最大。
- {
- adis[i]=MAX;
- acost[i]=MAX;
- }
- for(int i=1;i<=n;i++) //所有点均不在集合上。
- mark[i]=false;
- for(int i=1;i<=n;i++){ //对于邻接矩阵,i==j设为0,自己到自己必定不需要消耗,不相等设为无限大
- for(int j=1;j<=n;j++){
- if(i==j) {
- dis[i][j]=0;
- cost[i][j]=0;
- }
- else
- {
- dis[i][j]=MAX;
- cost[i][j]=MAX;
- }
- }
- }
- }
- int main()
- {
- int n,m; //点数,边数
- int start,over; //起点,终点。
- while(~scanf("%d%d",&n,&am...
登录后发布评论
暂无评论,来抢沙发