学了点求最短路径的算法,做道题练练。
1
#include <fstream>
2
#include <iostream>
3
4
using namespace std;
5
6
const int limit=102;
7
const long long Maxlongint=100000000;
8
9
ifstream fin("contest.in");
10
ofstream fout("contest.out");
11
12
long long s[7];
13
long long begin,end;
14
long long cost[8]={0,2,6,4,8,6,10,14};
15
long long map[limit][limit];
16
long long shortest[limit];
17
bool appear[limit];
18
19
void 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
37
void 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
57
void output(){
58
fout<<shortest[end]<<endl;
59
}
60
61
int main(){
62
init();
63
work();
64
output();
65
return 0;
66
}
67
#include <fstream>2
#include <iostream>3

4
using namespace std;5

6
const int limit=102;7
const long long Maxlongint=100000000;8

9
ifstream fin("contest.in");10
ofstream fout("contest.out");11

12
long long s[7];13
long long begin,end;14
long long cost[8]={0,2,6,4,8,6,10,14};15
long long map[limit][limit];16
long long shortest[limit];17
bool appear[limit];18

19
void 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

37
void 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

57
void output(){58
fout<<shortest[end]<<endl;59
}60
61
int main(){62
init();63
work();64
output(); 65
return 0;66
}67



浙公网安备 33010602011771号