http://acm.hdu.edu.cn/showproblem.php?pid=1874
Floyd:
Floyd:
//#pragma comment(linker, "/STACK:61400000,61400000")
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define pi 3.1415926535897932385
#define LL64 __int64
#define LL long long
#define oo 2147483647
#define N 100000100
#define M 210
#define INF 1e9
int tu[M][M];
int main()
{
int n, m;
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
//int _case = 1;
//scanf("%d", &t);
//while (t--)
//for (int _case = 1; _case <= t; _case++)
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j) tu[i][j] = 0;
else tu[i][j] = N;
}
}
for (int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (tu[a][b] == N) tu[a][b] = tu[b][a] = c;
else tu[a][b] = tu[b][a] = min(tu[a][b], c);
}
int s, t;
scanf("%d%d", &s, &t);
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
tu[i][j] = min(tu[i][j], tu[i][k] + tu[k][j]);
}
}
}
printf("%d\n", tu[s][t] == N ? -1 : tu[s][t]);
}
return 0;
}SPFA://#pragma comment(linker, "/STACK:61400000,61400000")
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define pi 3.1415926535897932385
#define LL64 __int64
#define LL long long
#define oo 2147483647
#define N 100000100
#define M 210
#define INF 1e9
int tu[M][M];
int dis[M];
queue<int> q;
int main()
{
int n, m;
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
//int _case = 1;
//scanf("%d", &t);
//while (t--)
//for (int _case = 1; _case <= t; _case++)
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
tu[i][j] = N;
}
}
for (int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (tu[a][b] == N) tu[a][b] = tu[b][a] = c;
else tu[a][b] = tu[b][a] = min(tu[a][b], c);
}
int s, t;
scanf("%d%d", &s, &t);
for (int i = 0; i < n; i++)
{
if (i == s) dis[i] = 0;
else dis[i] = N;
}
while (!q.empty())
{
q.pop();
}
q.push(s);
while (!q.empty())
{
int so = q.front();
q.pop();
for (int i = 0; i < n; i++)
{
if (i == so) continue;
if (dis[i] > dis[so] + tu[so][i])
{
dis[i] = dis[so] + tu[so][i];
q.push(i);
}
}
}
printf("%d\n", dis[t] == N ? -1 : dis[t]);
}
return 0;
}传统Dijkstra://#pragma comment(linker, "/STACK:61400000,61400000")
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define pi 3.1415926535897932385
#define LL64 __int64
#define LL long long
#define oo 2147483647
#define N 100000100
#define M 210
#define INF 1e9
int tu[M][M];
int dis[M];
bool tp[M];
int main()
{
int n, m;
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
//int _case = 1;
//scanf("%d", &t);
//while (t--)
//for (int _case = 1; _case <= t; _case++)
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
tu[i][j] = oo;
}
}
for (int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (tu[a][b] == oo) tu[a][b] = tu[b][a] = c;
else tu[a][b] = tu[b][a] = min(tu[a][b], c);
}
int s, t;
scanf("%d%d", &s, &t);
for (int i = 0; i < n; i++)
{
if (i == s) dis[i] = 0;
else dis[i] = oo;
}
memset(tp, 0, sizeof(tp));
for (int i = 0; i < n; i++)
{
int p = -1;
int d = oo;
for (int j = 0; j < n; j++)
{
if (tp[j] == 0)
{
if (d > dis[j])
{
d = dis[j];
p = j;
}
}
}
if (p == -1) break;
for (int j = 0; j < n; j++)
{
if (tu[p][j] != oo)
{
dis[j] = min(dis[j], dis[p] + tu[p][j]);
}
}
tp[p] = 1;
}
printf("%d\n", dis[t] == oo ? -1 : dis[t]);
}
return 0;
}HeapDijkstra://#pragma comment(linker, "/STACK:61400000,61400000")
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define pi 3.1415926535897932385
#define LL64 __int64
#define LL long long
#define oo 2147483647
#define N 100000100
#define M 210
#define INF 1e9
int tu[M][M];
int dis[M];
struct cmp
{
bool operator () (int x, int y)
{
return dis[x] > dis[y];
}
};
priority_queue<int, vector<int>, cmp> q;
int main()
{
int n, m;
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
//int _case = 1;
//scanf("%d", &t);
//while (t--)
//for (int _case = 1; _case <= t; _case++)
while (~scanf("%d%d", &n, &m))
{
memset(tu, -1, sizeof(tu));
for (int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (tu[a][b] == -1) tu[a][b] = tu[b][a] = c;
else tu[a][b] = tu[b][a] = min(tu[a][b], c);
}
int s, t;
scanf("%d%d", &s, &t);
for (int i = 0; i < n; i++)
{
if (i == s) dis[i] = 0;
else dis[i] = oo;
}
while (!q.empty())
{
q.pop();
}
q.push(s);
while (!q.empty())
{
int p = q.top();
q.pop();
for (int j = 0; j < n; j++)
{
if (tu[p][j] != -1)
{
if (dis[j] > dis[p] + tu[p][j])
{
dis[j] = dis[p] + tu[p][j];
q.push(j);
}
}
}
}
printf("%d\n", dis[t] == oo ? -1 : dis[t]);
}
return 0;
}

被折叠的 条评论
为什么被折叠?



