与我常在 @ 2019-09-24 10:21:56
贼难受
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10005;
const int M = 100005;
int n, m, b, num;
int f[N], dis[N], vis[N], head[N];
int to[M], val[M], next[M];
struct node {
int d;
int wz;
bool operator < (const node & A) const {
return d > A.d;
}
};
priority_queue <node> q;
inline int Max(int x, int y) {
return x > y ? x : y;
}
inline void add(int u, int v, int w) {
to[num] = v;
val[num] = w;
next[num] = head[u];
head[u] = num ++;
}
bool check(int x) {
if(f[1] > f[x] || f[n] > f[x]) return false;
memset(vis, 0, sizeof vis);
memset(dis, 0x3f, sizeof dis);
dis[1] = 0;
q.push((node) {0, 1});
while(!q.empty()) {
node u = q.top(); q.pop();
if(vis[u.wz]) continue;
vis[u.wz] = 1;
for(int i = head[u.wz]; ~i; i = next[i]) {
if(dis[to[i]] > dis[u.wz] + val[i] && !vis[to[i]] && f[to[i]] <= f[x]) {
dis[to[i]] = dis[u.wz] + val[i];
q.push((node) {dis[to[i]], to[i]});
}
}
}
return b > dis[n];
}
void divi(int l, int r) {
int ans = -1;
while(l <= r) {
int mid = l + r >> 1;
if(check(mid)) ans = f[mid], r = mid - 1;
l = mid + 1;
}
if(~ans) printf("%d\n", ans);
else puts("AFK");
}
int main() {
freopen("1.in", "r", stdin);
scanf("%d %d %d", &n, &m, &b);
for(int i = 1; i <= n; i ++) scanf("%d", &f[i]);
memset(head, -1, sizeof head);
for(int i = 1; i <= m; i ++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, w); add(v, u, w);
}
sort(f + 1, f + n + 1);
int l = 1, r = n;
divi(l, r);
return 0;
}
by 与我常在 @ 2019-09-24 10:28:35
大佬们看一眼吧
by 与我常在 @ 2019-09-24 11:14:01
交的时候没有打freopen
by Provicy @ 2019-09-24 11:31:26
为啥要sort。。。
by Provicy @ 2019-09-24 11:32:16
还有你的dijkstra跑的看起来比较慢。。。
by president @ 2019-09-24 11:43:17
while(l <= r) {
int mid = l + r >> 1;
if(check(mid)) ans = f[mid], r = mid - 1;
l = mid + 1;
}
你这一段,while里的条件和后面自己改一下,再试一下
by Papaya @ 2019-09-24 11:58:07
不要特判直接二分一把梭
还有你的ans为什么等于f[mid]
不应该直接等于mid吗
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) res=mid,r=mid-1;
else l=mid+1;
}
bool check(int x)
{
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis)); dis[1]=0;
priority_queue < qq > q; q.push((qq){0,1});
while(!q.empty())
{
int u=q.top().u;q.pop();
if(vis[u]) continue;vis[u]=1;
for(int j=head[u];j;j=e[j].nxt)
{
int v=e[j].v;ll d=e[j].d;
if(f[v]>x) continue;
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
if(!vis[v])
q.push((qq){dis[v],v});
}
}
}
return dis[n]<=b;
}
参考一下吧
by 与我常在 @ 2019-09-24 16:24:07
@Papaya 我直接输出的ans,所以存的就是f[mid]
by 与我常在 @ 2019-09-24 16:25:29
@DXL 堆优化+前向星,不能再快了吧。。。
排序是为了二分答案啊,我二分的f数组的下标
by 与我常在 @ 2019-09-24 16:27:22
@president 怎么改呀,蒟蒻背的模板。。
by 与我常在 @ 2019-09-25 16:42:57
犯了一个贼蠢的错误,二分的时候l = mid + 1 前面没加else,还有排完序后建边也要发生改变,所以我直接二分的0和f数组最大值,此贴终结