題目大意
有n個節點以及連線的p個無向邊,現在要通過這p條邊從1號節點連線到n號節點。若無法連線成功,則返回-1;若能夠連線成功,那麼其中用到了l條邊,這l條邊中有k條邊可以免費,l-k條邊不能免費,求出不能免費的邊的最大長度。
題目分析
實現(c++)
#include#include#include#include#includeusing namespace std;
#define max_node 1005
#define max_edge 20005
#define inf 1 << 28
#define min(a, b) a < b?a:b
#define max(a, b) a >b? a:b
struct edge;
struct nodedist;
};struct cmp
};edge gedges[max_edge];
int gedgecount;
int ghead[max_node];
int gdist[max_node];
bool **isited[max_node];
void insertedge(int u, int v, int d)
int dijkstra(int s, int t, int k)
for (int e = ghead[nd.v]; e != -1; e = gedges[e].next)
} }return gdist[t];
}int minstep(int s, int t)
for (int e = ghead[p.first]; e != -1; e = gedges[e].next)
} }return -1;
}int gedgedist[max_edge];
int main()
int min_step = minstep(1, n);
if (min_step == -1)
else if (min_step <= k)
sort(gedgedist, gedgedist + e_count);
int beg = 0, end = e_count, mid;
int rr;
while (beg < end)
else
} //最後得到的是,滿足路徑中邊長大於等於 x 的長度的邊數 大於k 最大的 x
printf("%d\n", rr);
} return 0;
}
查詢第K大的值
這種題一般是給定n個數,然後n個數之間通過某種計算得到了新的數列,求這新的數列的第k大的值 poj3579 題意 用 n 個數的序列 x i 生成乙個新序列 b 新的序列定義為 對於任意的 i j 且 i j 有 b abs x i x j 問新序列的中位數是什麼,如果新序列的長度為偶數那麼我們定義...
POJ 3273(二分,最小化最大值)
和這道題一樣了 description 聰哥在暑假參加了打零工的活動,這個活動分為n個工作日,每個工作日的工資為vi。有m個結算工錢的時間,聰哥可以自由安排這些時間,也就是說什麼時候拿錢,老闆說的不算,聰哥才有發言權!因為聰哥是土豪,他是老闆的老闆 聰哥不喜歡身上一次性有太多的錢,於是他想安排一下拿...
poj 3272 二分答案 最大值最小化
原題 給n個數 讓分成m個區域 讓最大值最小 可以通過二分答案來做 二分的範圍就是這n個數的最大值到他們的總和了 那麼我們防止邊界的問題 所以鬆弛一下 左右邊界各擴乙個點 然後每個mid就是要求的值 去跑個judge函式 看可劃分的區域個數 可劃分的區域個數如果 m 那麼就把上界下壓 如果 m 說明...