版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/82785752
Description
这次小杉来到了经典美剧《越狱》的场景里……
他被抓起来了(-.-干嘛幻想这么郁闷的场景……)。
小杉身为新一代的Scofield,在挖了半个月之后终于挖通牢房里的地道。
在地道里,无数的管道路线困惑了他。(若对情节有任何疑问,请观看原剧)
小杉看了看自己的纹身,明白了整个管道网是由N个小房间和若干小房间之间的单向的管道组成的。
小房间编号为不超过N的正整数。
对于某个管道,小杉只能在人品不超过一定程度时通过。
小杉一开始在房间1,现在小杉想知道,每个小房间他最多能够以人品多少的状态到达。
注意,小杉的人品在出发以后是不会改变的。
Input
每组测试数据的第一行有一个正整数N(1<=N<=2000)。
接下来若干行描述管道,每行三个正整数A,B,R(1<=A,B<=N),表示A房间有一条到达B房间的管道,且小杉的人品不超过R时可以通过(注意从B房间不可由此管道到达A房间,即管道是单向的)
整个输入数据以一行0 0 0结束
特别地,对于30%的数据,有N<=100
Output
对每组测试数据输出N-1行,分别表示对于2到N号的小房间,小杉最多能够以人品多少的状态到达。
Sample Input
4
1 2 30
1 3 20
2 3 25
3 4 30
2 4 20
0 0 0
Sample Output
30
25
25
HINT
对于样例数据:
小杉最多能够在人品为30的情况下到达小房间2(1->2)
小杉最多能够在人品为25的情况下到达小房间3(1->2->3)
小杉最多能够在人品为25的情况下到达小房间4(1->2->3->4)
SPFA变种,判断条件有些区别。
#include <iostream>
#include <queue>
#define SIZE 2001
#define INF 2e+09
using namespace std;
struct edge
{
int to, dis;
};
vector<edge> graph[SIZE];
queue<int> q;
int dis[SIZE];
bool inqueue[SIZE];
void spfa(void) // SPFA变种
{
int u, v, w, i;
dis[1] = INF;
q.push(1);
while (!q.empty())
{
u = q.front();
q.pop();
inqueue[u] = false;
for (i = 0; i < graph[u].size(); ++i)
{
v = graph[u][i].to;
w = graph[u][i].dis;
if (min(dis[u], w) > dis[v]) // 这里的判断条件有些不同.
{
dis[v] = min(dis[u], w);
if (!inqueue[v])
{
q.push(v);
inqueue[v] = true;
}
}
}
}
return;
}
int main(void)
{
int n, u, v, w, i;
scanf("%d", &n);
while (scanf("%d%d%d", &u, &v, &w), ((u) || (v) || (w)))
{
graph[u].push_back({v, w}); // 建图
}
spfa();
for (i = 2; i <= n; ++i)
{
printf("%d\n", dis[i]);
}
return 0;
}