uestc 方老师的分身 II

题意:求s到t走过边数大于k的最短路

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

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

spfa算法实现。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<cmath>
13 #include<stdlib.h>
14 #include<vector>
15 #define INF 1000000007
16 #define MAXN 5010
17 #define maxn 1000010
18 #define Mod 1000007
19 #define N 1010
20 using namespace std;
21 typedef long long LL;
22
23 struct node{
24     int u, e;
25 };
26 int n, m, u, v, wt;
27 int s, t, k;
28 int ans;
29 int dist[MAXN][55];
30 bool inq[MAXN][55];
31 vector< pair<int, int> > G[MAXN];
32
33 void spfa(int s)
34 {
35     int u, v, e, i, j, len;
36     for (i = 0; i <= n; ++i)
37         for (j = 0; j <= 50; ++j) {
38             dist[i][j] = INF;
39             inq[i][j] = 0;
40         }
41     queue<node> q;
42     ans = INF;
43     dist[s][0] = 0;
44     inq[s][0] = true;
45     q.push({s,0});
46     while (!q.empty()) {
47         node tmp = q.front();
48         q.pop();
49         u = tmp.u;
50         e = tmp.e;
51         if (u == t && e == k)
52             ans = min(dist[u][e],ans);
53         inq[u][e] = false;
54         int time;
55         if (e + 1 > k) time = k;
56         else time = e + 1;
57         for (i = 0; i < G[u].size(); ++i) {
58             v = G[u][i].first;
59             len = G[u][i].second;
60             if (dist[v][time] > len + dist[u][e]) {
61                 dist[v][time] = len + dist[u][e];
62                 if (!inq[v][time]) {
63                     q.push({ v, time });
64                     inq[v][time] = true;
65                 }
66             }
67         }
68     }
69 }
70
71 int main()
72 {
73     while (cin >> n >> m) {
74         for (int i = 0; i < MAXN; ++i) G[i].clear();
75         for (int i = 0; i < m; ++i) {
76             cin >> u >> v >> wt;
77             G[u].push_back({ v, wt });
78             G[v].push_back({ u, wt });
79         }
80         cin >> s >> t >> k;
81         spfa(s);
82         if (ans == INF) puts("-1");
83         else cout << ans << endl;
84     }
85     return 0;
86 }
时间: 2024-10-25 01:58:03

uestc 方老师的分身 II的相关文章

UESTC 915 方老师的分身II --最短路变形

即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了.求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #incl

UESTC_方老师的分身 II CDOJ 915

方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师计算出了走路时间最长的那个分身所用的时间.于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走.但是这个特殊的分身想走最短路的同时,要求至少经过k条边. Input 有多组数据 第一行两个整数n,m(1≤n

uestc 方老师的分身IV

类似POJ1386,参考的大神的博客 首先明确思路: 是否为连通图(并查集解决) -> 是否存在欧拉路径  ->  是否存在欧拉回路   (是,则选取字典序最小的输出,否则直接输出可行解) 注意区分有向图和无线图存在欧拉路径或者欧拉回路的条件: 无向图: G为连通图,并且G仅有两个奇度节点或者无奇度节点 推论:1.当G是仅有两个奇度节点的连通图时,G的欧拉通路必以此两个结点为端点 2.当G时无奇度结点的连通图时,G必有欧拉回路 3.G为欧拉图(存在欧拉回路)的充分必要条件是G为无奇度节点的连通

uestc 方老师的分身 III 拓扑排序

没什么好说的.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<cl

cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】

http://acm.uestc.edu.cn/#/problem/show/915 方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师计算出了走路时间最长的那个分身所用的时间.于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走.但是这个特殊的分身想走最

UESTC 916 方老师的分身III --拓扑排序

做法: 如果有a<b的关系,则连一条a->b的有向边,连好所有边后,找入度为0的点作为起点,将其赋为最小的价值888,然后其所有能到的端点,价值加1,加入队列,删去上一个点,然后循环往复,直到队列为空,即每个点都赋予了一个权值为止. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #in

UESTC 914 方老师的分身I Dijkstra

题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以此题为求两次最短路. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 100

UESTC 917 方老师的分身IV --求欧拉路径

判断欧拉路径是否存在及求出字典序最小的欧拉路径问题(如果存在). 将字符串的第一个字母和最后一个字母间连边,将字母看成点,最多可能有26个点(a-z),如果有欧拉路径,还要判断是否有欧拉回路,如果有,则需要找一个字典序最小的点开始生成这条链,否则以起点开始生成链,起点即为出度比入度大1的点. 欧拉路径是否存在的判定: 1.全部点在一个联通块                               ----用并查集判联通块的数量2.所有点出度入度相等                      

uestc 方老师和缘分

关于怎么建图,自己还真是想不出来. 我觉得就是找到每个方老师所在的scc里的所有缘分吧.. 转自http://www.cnblogs.com/whatbeg/p/3765621.html 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u->i.这样求出所有的强连通分量,每个强连通分量中方老师和缘分的数目一定是相等的,所以每个方老师一定可以找到与他在同一个强连通分量里的缘分,因为强连通分量中每个点都是可达的,某个