1. 程式人生 > >[USACO09FEB]改造路Revamping Trails 分層最短路 Dijkstra BZOJ 1579

[USACO09FEB]改造路Revamping Trails 分層最短路 Dijkstra BZOJ 1579

getchar() pair dijk 最短 traverse long long cow data ins

題意翻譯

約翰一共有N)個牧場.由M條布滿塵埃的小徑連接.小徑可 以雙向通行.每天早上約翰從牧場1出發到牧場N去給奶牛檢查身體.

通過每條小徑都需要消耗一定的時間.約翰打算升級其中K條小徑,使之成為高 速公路.在高速公路上的通行幾乎是瞬間完成的,所以高速公路的通行時間為0.

請幫助約翰決定對哪些小徑進行升級,使他每天從1號牧場到第N號牧場所花的時間最短

題目描述

Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= 50,000) trails conveniently numbered 1..M from pasture 1 all the way out to pasture N (a journey which is always possible for trail maps given in the test data). The N (1 <= N <= 10,000) pastures conveniently numbered 1..N on Farmer John‘s farm are currently connected by bidirectional dirt trails. Each trail i connects pastures P1_i and P2_i (1 <= P1_i <= N; 1 <= P2_i <= N) and requires T_i (1 <= T_i <= 1,000,000) units of time to traverse.

He wants to revamp some of the trails on his farm to save time on his long journey. Specifically, he will choose K (1 <= K <= 20) trails to turn into highways, which will effectively reduce the trail‘s traversal time to 0. Help FJ decide which trails to revamp to minimize the resulting time of getting from pasture 1 to N.

TIME LIMIT: 2 seconds

輸入輸出格式

輸入格式:

* Line 1: Three space-separated integers: N, M, and K

* Lines 2..M+1: Line i+1 describes trail i with three space-separated integers: P1_i, P2_i, and T_i

輸出格式:

* Line 1: The length of the shortest path after revamping no more than K edges

輸入輸出樣例

輸入樣例#1: 復制
4 4 1 
1 2 10 
2 4 10 
1 3 1 
3 4 100 
輸出樣例#1: 復制
1 

說明

K is 1; revamp trail 3->4 to take time 0 instead of 100. The new shortest path is 1->3->4, total traversal time now 1.

比較裸的題目,與之相似的是:[JLOI2011]飛行路線

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize("O3")
using namespace std;
#define maxn 1000005
#define inf 0x3f3f3f3f
#define INF 9999999999
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
	ll x = 0;
	char c = getchar();
	bool f = false;
	while (!isdigit(c)) {
		if (c == ‘-‘) f = true;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return f ? -x : x;
}

ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }

/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1; y = 0; return a;
	}
	ans = exgcd(b, a%b, x, y);
	ll t = x; x = y; y = t - a / b * y;
	return ans;
}
*/



ll qpow(ll a, ll b, ll c) {
	ll ans = 1;
	a = a % c;
	while (b) {
		if (b % 2)ans = ans * a%c;
		b /= 2; a = a * a%c;
	}
	return ans;
}

int n, m, k;
int d[maxn][30];
int vis[maxn][30];
vector<pii>vc[maxn];
int s, t;


struct node {
	int v, lev, dis;
	node(){}
	node(int v,int lev,int dis):v(v),lev(lev),dis(dis){}
	bool operator < (const node&rhs)const {
		return dis > rhs.dis;
	}
};

priority_queue<node>q;

int main()
{
	//ios::sync_with_stdio(0);
	rdint(n); rdint(m); rdint(k);
	for (int i = 1; i <= m; i++) {
		int u, v, w;
		rdint(u); rdint(v); rdint(w);
		vc[u].push_back(make_pair(v, w));
		vc[v].push_back(make_pair(u, w));
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= k; j++)d[i][j] = inf;
	}
	d[1][0] = 0;
	q.push(node(1, 0, 0));
	while (!q.empty()) {
		node tmp = q.top(); q.pop();
		int to = tmp.v, lev = tmp.lev;
		if (vis[to][lev])continue;
		vis[to][lev] = 1;
		vector<pii>::iterator it;
		for (it = vc[to].begin(); it != vc[to].end(); it++) {
			int y = (*it).first, w = (*it).second;
			if (d[y][lev] > d[to][lev] + w) {
				d[y][lev] = d[to][lev] + w;
				q.push(node(y, lev, d[y][lev]));
			}
			if (lev < k) {
				if (d[y][lev + 1] > d[to][lev]) {
					d[y][lev + 1] = d[to][lev];
					q.push(node(y, lev + 1, d[y][lev + 1]));
				}
			}
		}
	}
	int  ans = d[n][0];
	for (int i = 1; i <= k; i++) {
		ans = min(ans, d[n][i]);
	}
	cout << ans << endl;
    return 0;
}

[USACO09FEB]改造路Revamping Trails 分層最短路 Dijkstra BZOJ 1579