学了点求最短路径的算法,做道题练练。
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
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