您的位置:首页 > 其它

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

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: