導遊 (並查集 貪心)

2021-07-14 18:56:43 字數 1888 閱讀 2503

幫助mr.he找出所有遊客帶到目的地,且往返次數最少的路線,如果不能把遊客送到目的地,輸出「no」。

【輸入格式】

第一行兩個整數n和r,分別表示城市數量和道路數量,各城市編號為1..n。

接下來的r行,每行3個整數:a b p,表示道路ab的最大載客量為p。

最後有若干行,每包含3個整數:s d t,分別表示出發城市,目標城市的編號和遊客數量,以0 0為結束。

【輸出格式】

針對每個出發城市和目標城市,輸出乙個整數,表示需要往返的次數。

【輸入樣例】

7 10

1 2 30

1 3 15

1 4 10

2 4 25

2 5 60

3 4 40

3 6 20

4 7 35

5 7 20

6 7 30

1 7 99

3 7 70

0 0【輸出樣例】

5 3

【資料範圍】

最多有50000個城市,有100000條道路,道路的容量位於區間[1,100000]

這道題實際上是求路徑上的最小邊權值最大,有多種方法,可以二分答案+連通分量,可以二分答案+並查集,還可以並查集+貪心。

注意s等於d,最後找最小邊權值最大時ans的特殊情況。

//二分答案+連通分量

#include

#include

#include

#include

using

namespace

std;

const

int maxn=50002;

int n,r,s,d,t,x,y,c,vis[maxn];

vector

g[maxn],w[maxn];

void dfs(int i,int we)

} bool check(int i)

int main()

scanf("%d %d",&s,&d);

while(s!=0&&d!=0)

int a=0,b=100000,ans=0;

for(int i=0;i<20;i++)

if(ans<2) printf("no\n");

else

scanf("%d %d",&s,&d);

}return

0;}

//並查集+貪心

#include

#include

#include

#include

using

namespace

std;

const

int maxn=50002;

int x,y,c,n,r,s,d,t,fa[maxn];

struct edge

;vector

g; bool cmp(edge a,edge b)

void initial()

int find(int i)

void union(int x,int y)

bool check(int x,int y)

int main()

); }

scanf("%d %d",&s,&d);

sort(g.begin(),g.end(),cmp);

while(s!=0&&d!=0)

int ans=0;

for(int i=0;i1;i++)

}if(ans<1) printf("no\n");

else

scanf("%d %d",&s,&d);

}return

0;}

2054 貪心 並查集

貪心的總體思路是 每次找到乙個權值最大的節點,如果它是根節點,則首先對它染色,否則的話我們可以得出乙個結論,在對它的父親已經染色的情況下,立刻給它染色是最優的。現在重點討論第二種情況,當它不是根節點時,我們如果對它父親染了色,則一定會立刻對它染色,所以可以把它和它父親合併為同乙個節點,它和它父親的兒...

Supermarket(貪心 並查集)

題目鏈結 原創的部落格 題意 超市裡有n個商品.第i個商品必須在保質期 第di天 之前賣掉,若賣掉可讓超市獲得pi的利潤。每天只能賣乙個商品。現在你要讓超市獲得最大的利潤。n p i d i 範圍都在10000以內 include include include include include in...

Supermarket 並查集或貪心

題目大意 給你n個物品,每種物品都有乙個價值v和最晚 時間t,問你怎樣的順序 可獲得最大利潤?首先說貪心法 把物品按價值降序排序,然後從開始遍歷物品,如果這個物品在最晚期限那天可以 就在那天 並標記這天有物品 如果那天已經有物品 就向前找能 的第乙個時間,標記,當找不到能 的時間,則這個物品不能 因...