您的位置:首页 > Web前端

道路翻新 (Revamping Trails, USACO 2009 Feb)

2014-11-05 20:35 363 查看
题意:给定m<=50000的1-n有联通的图,求最多可以使K<=20条边变为0的情况下的最短路是多少。。

思路:简单的分层图最短路,对于每个点拆成K个点。。

然后求一边最短路。。

code:

/*
* Author:  Yzcstc
* Created Time:  2014/11/5 19:25:47
* File Name: revamp.cpp
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#define M0(x)  memset(x, 0, sizeof(int) * (n+10))
#define MP make_pair
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<ll, int> pii;
const int maxn = 1200000;
struct edge{
int v, w, next;
} e[maxn * 5];
int last[maxn], tot;
int n, k, m;

void add(const int &u,const int &v, const int& w){
e[tot] = (edge){v, w, last[u]}; last[u] = tot++;
}

void init(){
int u, v, w;
memset(last, -1, sizeof(int) * (n * k + 10));
tot = 0;
for (int i = 0; i < m; ++i){
scanf("%d%d%d", &u, &v, &w);
add(u, v, w); add(v, u, w);
for (int i = 1; i <= k; ++i){
add(u + i * n, v + i * n, w);
add(v + i * n, u + i * n, w);
add(u + (i-1) * n, v + i * n, 0);
add(v + (i-1) * n, u + i * n, 0);
}
}
}

ll dis[maxn];
int vis[maxn];
void dij(){
priority_queue<pii, vector<pii>, greater<pii> > q;
int nt = n * k + n;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= nt; ++i) dis[i] = (1LL<<50);
pii tmp(0, 1); dis[1] = 0;
q.push(tmp);
int u, v;
while (!q.empty()){
u = q.top().y;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int p = last[u]; ~p; p = e[p].next){
v = e[p].v;
if (dis[u] + e[p].w < dis[v]){
dis[v] = dis[u] + e[p].w;
tmp.x = dis[v], tmp.y = v;
q.push(tmp);
}
}
}
}

void solve(){
dij();
ll ans = 1LL<<50;
for (int i = 0; i <= k; ++i)
ans = min(ans, dis[n+i*n]);
cout << ans << endl;
}

int main(){
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
clock_t start, finish;
start = clock();
while (scanf("%d%d%d", &n, &m, &k) != EOF){
init();
solve();
}
finish = clock();
double t = (double)(finish - start) / CLOCKS_PER_SEC;
//    printf("time = %.6f\n", t);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: