学了点求最短路径的算法,做道题练练。

 1#include <fstream>
 2#include <iostream>
 3
 4using namespace std;
 5
 6const int limit=102;
 7const long long Maxlongint=100000000;
 8
 9ifstream fin("contest.in");
10ofstream fout("contest.out");
11
12long long s[7];
13long long begin,end;
14long long cost[8]={0,2,6,4,8,6,10,14};
15long long map[limit][limit];
16long long shortest[limit];
17bool appear[limit];
18
19void init(){
20     long long data[8];
21     long long p1,p2,k;
22     long long total;
23     for(int i=1;i<=limit;i++)
24        for(int j=1;j<=limit;j++)
25        map[i][j]=Maxlongint;
26     for(int i=1;i<=7;i++{ fin>>data[i]; data[i]++;}
27     fin>>begin>>end>>total;
28     for(int i=1;i<=total;i++){
29             fin>>p1>>p2>>k;
30             map[p1][p2]=cost[k]/data[k];
31             map[p2][p1]=cost[k]/data[k];
32             appear[p1]=true;
33             appear[p2]=true;
34             }

35}

36
37void work(){
38     bool visited[limit];
39     long long Min;
40     for(int i=1;i<=limit;i++)
41        shortest[i]=map[begin][i];
42     shortest[begin]=0;
43     while(!visited[end]){
44        Min=0;
45        for(int i=1;i<=limit;i++)
46                if(appear[i]&&(!visited[i]))
47                if((Min==0)||(shortest[Min]>shortest[i]))
48                Min=i;
49     visited[Min]=true;
50     for(int i=1;i<=limit;i++)
51             if((!visited[i]) && appear[i])
52             if((shortest[Min]+map[Min][i]<shortest[i]))
53             shortest[i]=shortest[Min]+map[Min][i];
54     }

55}

56
57void output(){
58     fout<<shortest[end]<<endl;
59     }

60     
61int main(){
62    init();
63    work();
64    output();  
65    return 0;
66}

67
posted on 2008-03-11 16:09  vector  阅读(119)  评论(0编辑  收藏  举报