【POJ 1062】昂贵的聘礼(最短路)
Dijkstra最短路,每次限制一个等级差,再更新答案。
#include <cstdio> #define N 105 #define INF 1e9 int m, n; int p[N], l[N], x, t, v, g[N][N]; int w, minc, d[N], u[N], ans; void Dijkstra(int q) { for(int i = 1; i <= n; i++){ d[i] = g[1][i]; if(!d[i])d[i]=INF; u[i]=0; } u[1] = 1; for(int i = 2; i <= n; i++) { minc = 1e9; w = 0; for(int j = 2; j <= n; j++) if(!u[j] && minc >= d[j] && l[j] >= q && l[j] <= q + m) { minc = d[j]; w = j; } if(!w) break; u[w] = 1; for(int j = 2; j <= n; j++) if(!u[j] && g[w][j] && d[j] > d[w] + g[w][j] && l[j] >= q && l[j] <= q + m) d[j] = d[w] + g[w][j]; } for(int i = 2; i <= n; i++) if(d[i] + p[i] < ans &&l[i] >= q && l[i] <= q + m)ans = d[i] + p[i]; } int main() { scanf("%d%d", &m, &n); for(int i = 1; i <= n; i++) { scanf("%d%d%d", &p[i], &l[i], &x); for(int j = 1; j <= x; j++) { scanf("%d%d", &t, &v); g[i][t] = v; } } ans = p[1]; for(int i = l[1] - m; i <= l[1] ; i++) Dijkstra(i); printf("%d\n",ans); return 0; }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆