您的位置:首页 > 产品设计 > UI/UE

uestc 方老师的分身 II

2015-02-17 05:14 507 查看
题意:求s到t走过边数大于k的最短路

思路:邻接表实现,用w[u][e]来维护(看的大牛博客),u表示当前点,e表示已经经过多少条边。感觉有点类似DP。

在边数大于k的处理上,发现还是使之等于k(K<=50),节省存储空间。

spfa算法实现。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#include<climits>
#include<string.h>
#include<cmath>
#include<stdlib.h>
#include<vector>
#define INF 1000000007
#define MAXN 5010
#define maxn 1000010
#define Mod 1000007
#define N 1010
using namespace std;
typedef long long LL;

struct node{
int u, e;
};
int n, m, u, v, wt;
int s, t, k;
int ans;
int dist[MAXN][55];
bool inq[MAXN][55];
vector< pair<int, int> > G[MAXN];

void spfa(int s)
{
int u, v, e, i, j, len;
for (i = 0; i <= n; ++i)
for (j = 0; j <= 50; ++j) {
dist[i][j] = INF;
inq[i][j] = 0;
}
queue<node> q;
ans = INF;
dist[s][0] = 0;
inq[s][0] = true;
q.push({s,0});
while (!q.empty()) {
node tmp = q.front();
q.pop();
u = tmp.u;
e = tmp.e;
if (u == t && e == k)
ans = min(dist[u][e],ans);
inq[u][e] = false;
int time;
if (e + 1 > k) time = k;
else time = e + 1;
for (i = 0; i < G[u].size(); ++i) {
v = G[u][i].first;
len = G[u][i].second;
if (dist[v][time] > len + dist[u][e]) {
dist[v][time] = len + dist[u][e];
if (!inq[v][time]) {
q.push({ v, time });
inq[v][time] = true;
}
}
}
}
}

int main()
{
while (cin >> n >> m) {
for (int i = 0; i < MAXN; ++i) G[i].clear();
for (int i = 0; i < m; ++i) {
cin >> u >> v >> wt;
G[u].push_back({ v, wt });
G[v].push_back({ u, wt });
}
cin >> s >> t >> k;
spfa(s);
if (ans == INF) puts("-1");
else cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: