公元2023年,人類進入了宇宙紀元。
l國有n個星球,還有n-1條雙向航道,每條航道建立在兩個星球之間,這n-1條航道連通了l國的所有星球。
小p掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如:有一艘物流飛船需要從ui號星球沿最快的宇航路徑飛行到vi號星球去。顯然,飛船駛過一條航道是需要時間的,對於航道j,任意飛船駛過它所花費的時間為tj,並且任意兩艘飛船之間不會產生任何干擾。
為了鼓勵科技創新,l國國王同意小p的物流公司參與l國的航道建設,即允許小p把某一條航道改造成蟲洞,飛船駛過蟲洞不消耗時間。
在蟲洞的建設完成前小p的物流公司就預接了m個運輸計畫。在蟲洞建設完成後,這m個運輸計畫會同時開始,所有飛船一起出發。當這m個運輸計畫都完成時,小p的物流公司的階段性工作就完成了。
如果小p可以自由選擇將哪一條航道改造成蟲洞,試求出小p的物流公司完成階段性工作所需要的最短時間是多少?
第一行包括兩個正整數n、m,表示l國中星球的數量及小p公司預接的運輸計畫的數量,星球從1到n編號。
接下來n-1行描述航道的建設情況,其中第i行包含三個整數ai, bi和ti,表示第i條雙向航道修建在ai與bi兩個星球之間,任意飛船駛過它所花費的時間為ti。
接下來m行描述運輸計畫的情況,其中第j行包含兩個正整數uj和vj,表示第j個運輸計畫是從uj號星球飛往vj號星球。
共1行,包含1個整數,表示小p的物流公司完成階段性工作所需要的最短時間。
input
6 3output1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 62 5
4 5
11將第1條航道改造成蟲洞:則三個計畫耗時分別為:11、12、11,故需要花費的時間為12。
將第2條航道改造成蟲洞:則三個計畫耗時分別為:7、15、11,故需要花費的時間為15。
將第3條航道改造成蟲洞:則三個計畫耗時分別為:4、8、11,故需要花費的時間為11。
將第4條航道改造成蟲洞:則三個計畫耗時分別為:11、15、5,故需要花費的時間為15。
將第5條航道改造成蟲洞:則三個計畫耗時分別為:11、10、6,故需要花費的時間為11。
故將第3條或第5條航道改造成蟲洞均可使得完成階段性工作的耗時最短,需要花費的時間為11。
首先考慮一下暴力,在n,m都小於3000時,先將兩點間的邊權值轉化為深度較大的點的權值,利用樸素lca求出兩點間的耗費時間,再列舉刪去哪一點列舉m中答案,更新即可
時間複雜度o(n*m),期望得分60分
1 #include2 #include3 #include4二分答案+樹上打差分using
namespace
std;
5 typedef long
long
lnt;
6struct
pntp[1000000
];14
struct
ente[1000000
];19
intcnt;
20int
n,m;
21 lnt ans=0x7f7f7f7f7f7f7f7fll;
22int u[300001
];23
int v[300001
];24
int tf[300001
];25
int hv[3005][3005
];26
void ade(int f,int
t,lnt y)
2734
void dfs(int x,int
f)3546}
47return;48
}49intmain()
5060 dfs(1,1
);61
for(int i=1;i<=m;i++)
6265
if(m==1)66
79if(x==y)
8084
while(x!=y)
8593 printf("
%lld\n
",mtmp-mins);
94return0;
95}96for(int i=1;i<=m;i++)
97109
if(x==y)
110114
while(x!=y)
115123 tf[i]=mtmp;
124}
125for(int i=2;i<=n;i++)
126132 ans=min(ans,maxs);
133}
134 printf("
%lld\n
",ans);
135return0;
136 }
將計畫排序。
1 #include2 #include3 #include4using
namespace
std;
5 typedef long
long
lnt;
6struct
pntp[1000000
];14
struct
ente[1000000
];19
struct
qntq[10000000
];24
intn,m;
25int
cnt;
26int
ont;
27int
lsd;
28int
top;
29int old[20][1000000
];30
int lg[2000000
];31
int lns[2000000
];32
int lfs[2000000
];33
bool
cmp(qnt x,qnt y)
3437
void ade(int f,int
t,lnt v)
3845
void dfs_build(int x,int
f)4662}
63if
(flag)
6467}68
void tr_dfs(int x,int
f)6978}
79return;80
}81int rmaxs(int x,int
y)82
85int lca(int x,int
y)86
92int ccl(int
agc)
93105 tr_dfs(1,1
);106 lnt ans=0
;107
for(int i=1;i<=n;i++)
108113
}114 lns[x]=ans;
115return
ans;
116}
117int
main()
118128
for(int i=2;i<=3*n;i++)
129132 dfs_build(1,1
);133
for(int i=1;i<=20;i++)
134for(int j=1;j+(1
<1
<=ont;j++)
135 old[i][j]=rmaxs(old[i-1][j],old[i-1][j+(1
<1
)]);
136for(int i=1;i<=m;i++)
137141 sort(q+1,q+m+1
,cmp);
142int l=0
;143
int r=q[1
].dtc;
144int
ans;
145while(l<=r)
146153
}154 printf("
%d\n
",ans);
155return0;
156 }
noip 2015 運輸計畫 (lca 二分)
95 最後乙個點t了 qian lv ji qiong 了 沒學過樹剖 聽chx聽xzc說的神奇的方法 orz 首先求出每個計畫的路徑長度 這裡寫的倍增 然後二分答案 對於每個ans 統計 他的路徑條數 tot 並維護最大差值 dec 並且對於每條不合法的路徑維護每個點的經過次數 然後列舉點 如果經...
noip2015 運輸計畫
公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球去...
NOIP2015 運輸計畫
題目鏈結 codevs 4632 題目大意 在一棵 n 節點樹上,有 m個運輸計畫 從ai 到 bi n,m 300000 問 把哪一條樹邊的權值變為0,可以使所有運輸計畫的最大距離最小,輸出這個最大距離的最小值。分析 0.首先要會lca和樹上差分。1.顯然,這道題要求樹上兩點之間的距離,所以要寫l...