1. 程式人生 > 實用技巧 >HDU 6797 Tokitsukaze and Rescue(最短路+刪邊+dfs)

HDU 6797 Tokitsukaze and Rescue(最短路+刪邊+dfs)

題意:給出一個完全圖,求刪除K邊後,最長的最短路徑。

題解:刪除的邊肯定要在最短路徑上刪除,刪除一條邊後,跑一次最短路徑,在從最短路徑上暴力選擇一個刪除,直到刪了K條邊。注意ans要初始化,還有就是最短路徑陣列是二維的,開滾動陣列在dfs的過程中被迭代掉。

#include <bits/stdc++.h>
#define IO_read ios::sync_with_stdio(false);cin.tie(0)
#define fre freopen("in.txt", "r", stdin)
#define _for(i,a,b) for(int i=a; i< b; i++)
#define
_rep(i,a,b) for(int i=a; i<=b; i++) #define inf 0x3f3f3f3f #define lowbit(a) ((a)&-(a)) using namespace std; typedef long long ll; template <class T> void read(T &x) { char c; bool op=0; while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1; x=c-'0'; while(c=getchar(), c>='
0'&&c<='9') x=x*10+c-'0'; if(op) x=-x; } template <class T> void write(T x) { if(x<0) putchar('-'), x=-x; if(x>=10) write(x/10); putchar('0'+x%10); } const int maxn=55, maxm=2505; int T, n, k; struct qnode{ int v, c; qnode(int _v=0, int _c=0):v(_v), c(_c) {}
bool operator <(const qnode &r) const{ return c>r.c; } }; struct Edge{ int v, cost; Edge(int _v=0, int _cost=0): v(_v), cost(_cost) {} }; vector<Edge> E[maxn]; int vis[maxn], pre[maxn][maxn]; int dis[maxn], val[maxn][maxn]; void dijkstra(int deep, int start) { for(int i=1; i<=n; i++) dis[i]=inf, vis[i]=0; priority_queue<qnode> que; que.push(qnode(start, 0)); dis[start]=0; while(!que.empty()) { qnode tmp=que.top(); que.pop(); int u=tmp.v; if(vis[u]) continue; vis[u]=true; for(int i=0; i<E[u].size(); i++) { int v=E[u][i].v; int cost=val[u][v]; if(!vis[v] && dis[v]>dis[u]+cost) { dis[v]=dis[u]+cost; pre[deep][v]=u; que.push(qnode(v, dis[v])); } } } } int ans; void del(int x) { dijkstra(x, 1); if(!x){ if(dis[n]!=inf) ans=max(ans, dis[n]); return; } for(int i=n; pre[x][i]; i=pre[x][i]) { int j=pre[x][i]; int w=val[i][j]; val[i][j]=val[j][i]=inf; del(x-1); val[i][j]=val[j][i]=w; } } int main() { //fre; read(T); while(T--) { read(n), read(k); for(int i=1; i<=n; i++) E[i].clear(); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) val[i][j]= i==j? 0:inf; for(int i=1; i<=n*(n-1)/2; i++) { int u, v, w; read(u), read(v); read(w); E[u].push_back(Edge(v, w)); E[v].push_back(Edge(u, w)); val[u][v]=val[v][u]=w; } ans=-inf; del(k); printf("%d\n", ans); } return 0; }