Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38499
  • 博文数量: 64
  • 博客积分: 2640
  • 博客等级: 少校
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:15
文章分类
文章存档

2010年(64)

我的朋友
最近访客

分类: C/C++

2010-01-26 13:46:19

2008-10-02


#include<iostream>
using namespace std;
#define MAX 10000
int edge[16][16];
int dijkstra(int start,int end,int path[]);
void Output(int path[],int end);
int main(void){
    for(int i=0;i<16;i++){
        for(int j=1;j<16;j++)
            edge[i][j] = MAX;
        edge[i][i]=0;
    }
    edge[0][1] = 2;
    edge[0][2] = 3;
    edge[1][3] = 1;
    edge[1][4] = 2;
    edge[2][4] = 5;
    edge[2][5] = 4;
    edge[3][6] = 3;
    edge[3][7] = 2;
    edge[4][7] = 4;
    edge[4][8] = 2;
    edge[5][8] = 4;
    edge[5][9] = 4;
    edge[6][10] = 1;
    edge[7][10] = 3;
    edge[7][11] = 1;
    edge[8][11] = 1;
    edge[8][12] = 3;
    edge[9][12] = 3;
    edge[10][13] = 4;
    edge[11][13] = 2;
    edge[11][14] = 2;
    edge[12][14] = 2;
    edge[14][15] = 3;
    edge[13][15] = 2;
   
    int start,end;
    int path[20];
    cin>>start>>end;
   
    int len = dijkstra(start,end,path);
    if(len<MAX){
    cout<<len<<endl;
    Output(path,end);
    }
    else{
    cout<<"No path";
    }
       
    getchar();getchar();
   
    return 0;
}
int find_min(int num[],int n,bool state[]){
    int r=0;
    while(state[r]) r++;
    for(int i=1;i<n;i++)
        if(num[r]>num[i]&&!state[i]) r = i;
       
    return r;
}//在s2中选择最短的点

int dijkstra(int start,int end,int path[]){
     bool state[16] = {0,0,0,0,0,0};
     state[start] = true;
     int mindis[16],newl;
    
     for(int i=0;i<16;i++){
         mindis[i] = edge[start][i];
         if(edge[start][i]<MAX)
            path[i] = start;
         else
            path[i] = -1;
     }
        
     while(!state[end]){
          int min = find_min(mindis,16,state);
          if(mindis[min]>=MAX) break;
          state[min] = true;
         
          for(int i=0;i<16;i++){
              if(!state[i]&&edge[min][i]<MAX){
              newl = mindis[min]+edge[min][i];
              if(newl<mindis[i]){
                 mindis[i] = newl;
                 path[i] = min;
                 }
              }
          }
     }
    
     return mindis[end];
}
void Output(int path[],int end){
     if(path[end]==-1) cout<<"No path";
     else if(path[end] == end) cout<<end<<" ";
     else{ Output(path,path[end]); cout<<end<<" ";}
}


阅读(148) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~