HDU 3873 Invade the Mars 【思维好题 + 最短路】
2018-01-24 15:12
441 查看
传送门
// 题意: 起点是1, 终点是n , 某些城市会受到其他城市的保护, 受到保护的城市必须在保护该城市的城市被攻陷后才能被进入, 还有一点是军队是同时出发的, 也就是军队可以在受保护的城市外面停留, 等到保护其城市被攻陷后军队可以马上进入该座城市, 也就是说进入一座城市的时间是max(第一次到达, 保护其城市的城市被攻陷的时间). 问到达n点的最少时间是多少.
// 这道题我觉得就很好了, 也不考你什么很牛逼的建图方法, 就纯考思维, 那么最先肯定是最短路没跑了, 就是与几个限制而已. 那么我们首先设置几个数组, du[i]表示守护i城市的城市数量, t[i]表示攻占守护i城市的城市所需的最大时间, dis[i] 表示到达i城市的最少时间(只是到达i, 不一定进去了, 如果守护它的城市都沦陷了, 才算进去了.) , 那么根据dij思想, 入队的一定是已经可以到达该城市的, 也就是du[i] == 0 时才能被入队, 但是dis[i] 都要被更新, 只是入不入对 的区别, 然后对于每一个取出来的点, 有dij思想可以得知, 该点的最短距离就被确定了, 所以我们要用这个点去更新它所守护城市的t[v], 然后如果它所守护的城市已经到达了, 只是没有入队而已, 那么我们就要更新它所守护的城市的dis, 并将其入队.
AC Code
// 题意: 起点是1, 终点是n , 某些城市会受到其他城市的保护, 受到保护的城市必须在保护该城市的城市被攻陷后才能被进入, 还有一点是军队是同时出发的, 也就是军队可以在受保护的城市外面停留, 等到保护其城市被攻陷后军队可以马上进入该座城市, 也就是说进入一座城市的时间是max(第一次到达, 保护其城市的城市被攻陷的时间). 问到达n点的最少时间是多少.
// 这道题我觉得就很好了, 也不考你什么很牛逼的建图方法, 就纯考思维, 那么最先肯定是最短路没跑了, 就是与几个限制而已. 那么我们首先设置几个数组, du[i]表示守护i城市的城市数量, t[i]表示攻占守护i城市的城市所需的最大时间, dis[i] 表示到达i城市的最少时间(只是到达i, 不一定进去了, 如果守护它的城市都沦陷了, 才算进去了.) , 那么根据dij思想, 入队的一定是已经可以到达该城市的, 也就是du[i] == 0 时才能被入队, 但是dis[i] 都要被更新, 只是入不入对 的区别, 然后对于每一个取出来的点, 有dij思想可以得知, 该点的最短距离就被确定了, 所以我们要用这个点去更新它所守护城市的t[v], 然后如果它所守护的城市已经到达了, 只是没有入队而已, 那么我们就要更新它所守护的城市的dis, 并将其入队.
AC Code
const int maxn = 3e3 + 5; const int maxm = 7e4 + 5; const int inf = 0x3f3f3f3f; const ll INF = 1e18; struct node { int to, next; ll w; bool operator < (const node &a ) const { return w > a.w; } }e[maxm]; int cnt, head[maxn]; int du[maxn]; vector<int>ve[maxn]; void add(int u, int v, int w) { e[cnt] = node{v, head[u], w}; head[u] = cnt++; } int n, m; void init() { cnt = 0; Fill(du, 0); Fill(head, -1); for (int i = 1 ; i <= n ; i ++) ve[i].clear(); } ll dis[maxn], t[maxn]; bool vis[maxn]; void dij(int st, int ed) { priority_queue<node>q; for (int i = 1 ; i <= n ; i ++) dis[i] = INF; dis[st] = 0; Fill(vis, 0); Fill(t, 0); q.push(node{st, 0, 0}); du[1] = 0; while(!q.empty()) { node u = q.top(); q.pop(); if (vis[u.to]) continue; vis[u.to] = 1; for (auto x : ve[u.to]) { du[x]--; t[x] = max(t[x], dis[u.to]); if (dis[x] != INF && !du[x]) { dis[x] = max(dis[x], t[x]); q.push(node{x, 0, dis[x]}); } } if (u.to == ed) break; for (int i = head[u.to] ; ~i ; i = e[i].next) { int to = e[i].to; if (dis[to] > dis[u.to] + e[i].w) { dis[to] = dis[u.to] + e[i].w; if (!du[to]) q.push(node{to, 0, dis[to]}); } } } cout << dis[ed] << endl; } void solve() { init(); cin >> n >> m ; for(int i = 1 ; i <= m ; i ++) { int u, v, w; cin >> u >> v >> w; add(u, v, w); } for (int i = 1 ; i <= n ; i ++) { int x ; cin >> x; while(x--) { du[i]++; int y ; cin >> y ; ve[y].pb(i); } } dij(1, n); }
相关文章推荐
- Invade the Mars HDU - 3873(最短路变体)
- hdu 3873 Invade the Mars(dij变体,带限制最短路)
- Invade the Mars HDU - 3873 (最短路)题解
- hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)
- 【HDU】3873 Invade the Mars 最短路
- HDU 3873 Invade the Mars Dijkstra变种
- HDU 3873 Invade the Mars (dijkstra变形)
- hdu 3873 Invade the Mars(自写堆优化Dijkstra)
- hdu 3873 Invade the Mars
- HDU-387 Invade the Mars 最短路
- 【最短路】 HDOJ 3873 Invade the Mars
- HDU 3873 Invade the Mars
- hdu 3873 Invade the Mars(heap + dij变形)
- hdu 4725 The Shortest Path in Nya Graph(最短路)
- hdu 5137 How Many Maos Does the Guanxi Worth(最短路)
- HDU-1596 find the safest road(最短路[Dijkstra])
- hdu 5876 Sparse Graph【最短路+思维】好题
- hdu-1800 Flying to the Mars
- hdu 1800 flying to the mars(贪心算法)
- HDU - 1595 find the longest of the shortest(最短路Dijkstra+枚举删边)