WarTransportation (千分题,不水)
题意是:有两个人在博弈,玩家A疯狂的要走最短路(起点是1,终点是2),
玩家B在合适的时机删一条边使得玩家A的最短路最大,求这个值
(如果不行输出-1)
这题我们的优势在于 V,E V , E 很小,都在100以下
考虑这道题目。
不难想出一种暴力方法:
每次删去一条边,然后求出这个图中 ShortestPath S h o r t e s t P a t h ,(可以通过 Dijstra D i j s t r a ,存储在bad[i]中)实现
时间复杂度 O(EV2) O ( E V 2 ) ,可以接受,之后通过类似 DP D P 的方法求解:
dist[i] d i s t [ i ] 表示从1到达 i i 得最坏最短路的情况
答案就是 dist[0] d i s t [ 0 ]
#include <bits/stdc++.h>
using namespace std ;
#define inf 0x3f3f3f3f
class WarTransportation{
public:
vector< vector <int > > g,e,w1,w2 ;
int Dij(int ,int ,int ,int ,int);
int messenger(int ,vector<string> ) ;
};
int WarTransportation::Dij(int s,int t,int n,int a,int b){ //一波Dijstra模板
priority_queue< pair<int,int> > q ;
vector<int> dist,v ;
dist.assign(n,inf);dist[s]=0 ;
v.assign(n,0);q.push(make_pair(0,s)) ;
while(1){
int i,j ;
while(!q.empty() && v[q.top().second]) q.pop() ;//当前节点已经访问
if (q.empty()) break ;
i=q.top().second;q.pop();v[i]=1 ;//访问队列头
if (i==t) return dist[t] ;//查找到终点
for (j=0;j<g[i].size();j++){
if (!(i==a && j==b)){ //不是那条被删去的边
if (dist[i]+w1[i][j]<dist[g[i][j]]){ //松弛
dist[g[i][j]]=dist[i]+w1[i][j] ;
q.push(make_pair(-dist[g[i][j]],g[i][j])) ;
}
}
}
}
return inf ;
}
int WarTransportation::messenger(int n, vector<string> highways){
priority_queue<pair<int,int> > q;
vector<int> dist,v,bad ;
char ch ;
stringstream buf ;//输出流解决建边
buf.clear() ;
for (int i=0;i<highways.size();i++) buf<<highways[i] ;
g.resize(n);w1.resize(n) ;
e.resize(n);w2.resize(n) ;
int a,b,c ;
while (buf>>a>>b>>c){
g[a-1].push_back(b-1) ;
w1[a-1].push_back(c) ;
e[b-1].push_back(a-1) ;
w2[b-1].push_back(c) ;
buf>>ch ;
}
bad.assign(n,0) ;//求出删去某一条边时的最长最短路
for (int i=0;i<n;i++){
if (i==1) continue ;
for (int j=0;j<g[i].size();j++) bad[i]=max(bad[i],Dij(i,1,n,i,j));
}
dist.assign(n,inf);dist[1]=0;//跑一遍最短路求出答案
v.assign(n,0);q.push(make_pair(0,1)) ;
while(!q.empty()){
while (!q.empty() && v[q.top().second]) q.pop() ;
if (q.empty()) break ;
int i=q.top().second;q.pop();v[i]=1;
for (int j=0;j<e[i].size();j++){
if (max(bad[e[i][j]],dist[i]+w2[i][j])<dist[e[i][j]]){
dist[e[i][j]]=max(bad[e[i][j]],dist[i]+w2[i][j]) ;
q.push(make_pair(-dist[e[i][j]],e[i][j])) ;
}
}
}
return (dist[0]<inf) ? dist[0]:-1 ;
}