給出乙個有邊權和點權的無向圖,規定路徑長度為路徑經過的邊權和。求出這麼一條從起點到終點的路徑,它的長度小於等於給出的長度限制(條件1),且經過的點權最大的點的點權是所有滿足條件1的路徑中的最小的。
圖論題我沒怎麼接觸過需要用到反演思想的,然而這道題就是。我們發現這個圖有這麼乙個單調性:選的點數越多,子圖中起點到終點的最短路徑就會越短。因此我們每次列舉乙個節點,將點權小於等於該節點的節點都納入子圖(顯然該節點的點權越大,加入子圖中的節點數越多),看看圖中的最短路徑長度是否小於等於長度限制。顯然列舉的節點的點權越大,滿足限制條件可能性越大,反之越小。這樣我們就可以二分了。
#include #include #include #include #include using namespace std;const int max_node = 10010, max_edge = 100010, inf = 0x3f3f3f3f;
int distlimit;
struct node;
struct edge;
struct node
_nodes[max_node], *sorted[max_node];
int totnode;
struct edge
_edges[max_edge];
int _ecount;
struct cmppnode
};bool cmp(node *a, node *b)
void addedge(node *from, node *to, int w)
void build(int uid, int vid, int w)
struct heapnode
bool operator < (const heapnode& a) const
}; void dijkstra()
if (!_nodes[1].ingraph)
return;
_nodes[1].dist = 0;
static priority_queueq;
q.push(heapnode(0, _nodes + 1));
while (!q.empty())}}
}bool alive(int x)
int lowerbound(int l, int r, bool (*inrange) (int))
return l;
}int main()
for (int i = 1; i <= totnode; i++)
sorted[i] = _nodes + i;
sort(sorted + 1, sorted + totnode + 1, cmp);
int p = lowerbound(1, totnode, alive);
if (p == -1)
printf("afk\n");
else
printf("%d\n", sorted[p]->weight);
return 0;
}
水題日常 Luogu1462 通往奧格瑞瑪的道路
qwq馬上高二啦不能頹啦 知乎上聽說寫部落格的效果挺好的,來試一下好啦 題目鏈結 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進而損失一定的血量。每次經過乙個城市,都會被收取一定的過路費 包括起點和終點 路上並沒有...
洛谷1462 通往奧格瑞瑪的道路
洛谷1462 通往奧格瑞瑪的道路 題目背景 在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 題目描述 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著...
P1462 通往奧格瑞瑪的道路
在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...