幫助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,問你怎樣的順序 可獲得最大利潤?首先說貪心法 把物品按價值降序排序,然後從開始遍歷物品,如果這個物品在最晚期限那天可以 就在那天 並標記這天有物品 如果那天已經有物品 就向前找能 的第乙個時間,標記,當找不到能 的時間,則這個物品不能 因...