網(wǎng)站 被攻擊_主業(yè)篡改 被黑了 織夢(mèng)做的站市場(chǎng)調(diào)研
烏拉烏拉國有n個(gè)城市和m條道路,城市編號(hào)為1~n。由于烏拉烏拉國每一個(gè)城市都在創(chuàng)城(創(chuàng)建文明城市),因此,城市之間的道路通行施行道路交通管制:
?已知從城市ui?到城市vi?的道路,需要時(shí)間ti?。但是一旦當(dāng)?shù)缆饭芾韱T進(jìn)入某條道路后,任何人在道路管理員未駛出該道路前不允許進(jìn)入該道路。例如:道路管理員在第4時(shí)刻進(jìn)入該道路,在路上需要花費(fèi)3時(shí),那么在第4~6時(shí)刻不允許其他人進(jìn)入改街道,只能第7時(shí)刻及其以后進(jìn)入或者在第4時(shí)刻之前進(jìn)入。
?現(xiàn)在,計(jì)算鴨知道,道路管理員從0時(shí)刻出發(fā),依次經(jīng)過g個(gè)城市,計(jì)算鴨從時(shí)刻k出發(fā),從城市a前往城市b。請(qǐng)問,計(jì)算鴨最少需要多長時(shí)間。輸入格式:
輸入的第一行給出兩個(gè)整數(shù)n,m——表示城市的數(shù)量和道路的數(shù)量。
輸入的第二行給出四個(gè)整數(shù)a,b,k,g——a,b分別表示計(jì)算鴨的初始城市和目的城市;k表示計(jì)算鴨出發(fā)時(shí)刻;g表示道路管理員需要經(jīng)過的城市數(shù)量。
輸入的第三行給出g個(gè)整數(shù)xi?——表示道路管理員需要經(jīng)過的城市編號(hào)。
接下來m行,每行3個(gè)整數(shù)ui?,vi?,ti?——表示從ui?至vi?需要用時(shí)ti?
2≤n≤103
2≤m≤104
1≤a,b,ui?,vi?≤n
0≤k,g≤103
1≤ti?≤103
輸出格式:
輸出一個(gè)整數(shù)——表示計(jì)算鴨從a城市到b城市的最短用時(shí)。
輸入樣例:
6 5 1 6 20 4 5 3 2 4 1 2 2 2 3 8 2 4 3 3 6 10 3 5 15
輸出樣例:
21
輸入樣例:
8 9 1 5 5 5 1 2 3 4 5 1 2 8 2 7 4 2 3 10 6 7 40 3 6 5 6 8 3 4 8 4 4 5 5 3 4 23
輸出樣例:
40
思路:?
定義一個(gè)mp[N][N]數(shù)組記錄每條道路的長度;
for(int i = 1 ; i <= m ; i ++){ll u , v , w;cin >> u >> v >> w;add(u,v,w) , add(v,u,w);mp[u][v] = mp[v][u] = w;}
一個(gè)tle[N][N][2]數(shù)組記錄道路的禁止進(jìn)入的開始和結(jié)束時(shí)間,now為當(dāng)前的時(shí)間。
比如3->5的花費(fèi)是15,那么禁行時(shí)間為0->14,接下來3->2是8,禁行時(shí)間為15->22;
for(int i = 0 ; i < g - 1; i ++){tle[gl[i]][gl[i+1]][0] = tle[gl[i+1]][gl[i]][0] = now;now += mp[gl[i]][gl[i+1]] - 1;tle[gl[i]][gl[i+1]][1] = tle[gl[i+1]][gl[i]][1] = now;now ++ ;}
?記錄鴨要從k時(shí)壓入隊(duì)列進(jìn)行做短路。
如果當(dāng)前點(diǎn)的時(shí)間花費(fèi)在不能走當(dāng)前想走的道路的禁行時(shí)間內(nèi),那么只能在禁行時(shí)間后開始走。
若不在禁行時(shí)間內(nèi),則直接進(jìn)行普通最短路。
if(dist[t] >= tle[t][x][0] && dist[t] <= tle[t][x][1]){if(dist[x] <= tle[t][x][1] + 1 + w[i])continue;dist[x] = tle[t][x][1] + 1 + w[i];q.push({dist[x],x});}else{if(dist[x] <= dist[t] + w[i])continue ;dist[x] = dist[t] + w[i];q.push({dist[x],x}); }
?總代碼:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n , m , T ;
const int N = 1005 , M = 20005;
int e[M] , ne[M] , w[M] , dist[N] , h[N] , idx;
bool st[N];
void add(int a,int b,int c){ne[idx] = h[a] , e[idx] = b , w[idx] = c , h[a] = idx ++;
}
#define pii pair<int,int>
ll tle[N][N][2];
void bfs(int a,int b,int k){memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);priority_queue<pii,vector<pii>,greater<pii> >q;dist[a] = k;q.push({dist[a],a});while(!q.empty()){auto t = q.top().second;q.pop();if(st[t])continue ;st[t] = 1;for(int i = h[t] ; ~ i ; i = ne[i]){int x = e[i];if(dist[t] >= tle[t][x][0] && dist[t] <= tle[t][x][1]){if(dist[x] <= tle[t][x][1] + 1 + w[i])continue;dist[x] = tle[t][x][1] + 1 + w[i];q.push({dist[x],x});}else{if(dist[x] <= dist[t] + w[i])continue ;dist[x] = dist[t] + w[i];q.push({dist[x],x}); }}}cout << dist[b] - k << endl;
}
ll mp[N][N] , gl[N];
int main(){idx = 0;memset(h , -1,sizeof h);cin >> n >> m;ll a , b , k , g;cin >> a >> b >> k >> g;for(int i = 0 ; i < g ; i ++){cin >> gl[i];}ll cnt = 0 , now = 0;for(int i = 1 ; i <= m ; i ++){ll u , v , w;cin >> u >> v >> w;add(u,v,w) , add(v,u,w);mp[u][v] = mp[v][u] = w;}for(int i = 0 ; i < g - 1; i ++){tle[gl[i]][gl[i+1]][0] = tle[gl[i+1]][gl[i]][0] = now;now += mp[gl[i]][gl[i+1]] - 1;tle[gl[i]][gl[i+1]][1] = tle[gl[i+1]][gl[i]][1] = now;now ++ ;}bfs(a,b,k);
}