题意:
带权值的无向图,问s到t间的最短距离。
解析:
最短路。
点边数比较大,用spfa。
栈超时,优先队列超时,队列0.195s。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
using namespace std;
const int maxn = 50000 + 10;
const int inf = 0x3f3f3f3f;
int n, m, s, t;
int head[maxn];
bool vis[maxn];
int dis[maxn];
int edgeNum;
struct Edge
{
int fr, to, val;
} e[maxn << 1];
void addEdge(int f, int t, int w)
{
e[edgeNum].fr = head[f];
e[edgeNum].to = t;
e[edgeNum].val = w;
head[f] = edgeNum++;
}
void spfa()
{
for (int i = 0; i < n; i++)
{
dis[i] = inf;
vis[i] = false;
}
queue<int> q;
q.push(s);
dis[s] = 0;
vis[s] = true;
while (!q.empty())
{
int cur = q.front();
q.pop();
for (int i = head[cur]; i != -1; i = e[i].fr)
{
int x = e[i].to;
if (dis[cur] + e[i].val < dis[x])
{
dis[x] = dis[cur] + e[i].val;
if (!vis[x])
{
vis[x] = true;
q.push(x);
}
}
}
vis[cur] = false;
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int ncase;
int ca = 1;
scanf("%d", &ncase);
while (ncase--)
{
edgeNum = 0;
memset(head, -1, sizeof(head));
scanf("%d%d%d%d", &n, &m, &s, &t);
for (int i = 0; i < m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w);
}
spfa();
if (dis[t] == inf)
printf("Case #%d: unreachable\n", ca++);
else
printf("Case #%d: %d\n", ca++, dis[t]);
}
return 0;
}
void addEdge(int fr, int to, int val)
{
e[edgeNum].fr = fr;
e[edgeNum].to = to;
e[edgeNum].val = val;
edgeNum++;
return;
}