杭电2066 一个人的旅行
题目http://acm.hdu.edu.cn/showproblem.php?pid=2066
方法1:Dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mm 1010
using namespace std;
int T, S, D,n,minn;
int r[mm][mm],mark[mm];
void dijks() {
for (int i = 1; i <= n; i++) {
int mi = 0xffff,v;
for (int j = 1; j <= n; j++) {
if (!mark[j] && r[0][j] < mi)
mi = r[0][j],v=j;
}
if (mi == 0xffff)
break;
else
mark[v] = 1;
for (int j = 1; j <= n; j++) {
if (!mark[j] && mi + r[v][j] < r[0][j])
r[0][j]=mi + r[v][j];
}
}
}
int main() {
while (cin >> T >> S >> D) {
for (int i = 0; i < mm; i++) {
for (int j = 0; j < mm; j++) {
if (i == j)r[i][j] = 0;
else r[i][j] =0xffff;
}
}
int x, y, temp;
for (int i = 0; i < T; i++) {
cin >> x >> y >> temp;
if (temp < r[x][y])
r[x][y] = r[y][x] = temp;
n = max(n, max(x, y));
}
//memset(st, 0, sizeof(st));
//memset(de, 0, sizeof(de));
for (int i = 0; i < S; i++) {
cin >> temp;
r[0][temp] = 0;
}
memset(mark, 0, sizeof(mark));
minn = 0xffff;
dijks();
//for (int i = 0; i <= n; i++) {
// cout << r[0][i] << ' ';
//}
for (int i = 0; i < D; i++) {
cin >> temp;
minn = min(minn, r[0][temp]);
}
printf("%d\n", minn);
}
return 0;
}
方法2:floyed
//找最短路径的问题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll T, S, D,minn=0xffff;
int lc[1010][1010];
int de[1010], st[1010];
int n;
void floyed() {
for (int k = 0; k <= n; k++) {
for (int i = 0; i <= n; i++) {
if (lc[i][k] == 0xffff)continue;
for (int j = 0; j <= n; j++) {
//if (i == j)continue;
if (lc[i][j] > lc[i][k] + lc[k][j])
lc[i][j] =lc[j][i]= lc[i][k] + lc[k][j];
if(st[i]&&de[j]&&minn > lc[i][j])
minn = lc[i][j];
}
}
}
}
int main() {
while (cin >> T >> S >> D) {
minn = 0xffff;
for (int i = 0; i < 1010; i++) {
for (int j = 0; j < 1010; j++) {
if (i == j) lc[i][j] = 0;
else lc[i][j] = 0xffff;
}
}
ll t = T;
while (t--) {
int i, j, temp;
cin >> i >> j >> temp;
if (temp < lc[i][j])
lc[i][j] = lc[j][i] = temp;
n = max(n, max(i, j));
}
t = S;
int k;
memset(st, 0, sizeof(st));
memset(de, 0, sizeof(de));
while (t--) {
cin >> k;
st[k] = 1;
}
t = D;
while (t--) {
cin >> k;
de[k] = 1;
}
floyed();
printf("%lld\n", minn);
}
return 0;
}
仅供个人温习