杭电多校day2----传奇勇士小凯

题目链接:Problem - 7450 (hdu.edu.cn)

Problem Description

传说在遥远的魔法大陆有着一个村庄叫做卡卡奇里奇,这里有n座房屋,n−1条道路,保证了任意两座房屋之间都可以通过道路相互可达。这里环境优美,居民幸福地生活着。

但是有一天晚上,原本平静的村庄突然受到一不明寄生生命体的袭击,奇怪的怪物绑架了所有居民,并控制了所有房屋。凌晨时分,在外游历的勇士小凯收到了卡卡奇里奇国王的召唤来到了卡卡奇里奇,奉命消灭所有怪物,解救整个村庄。

由于有人工智能Fairy的存在,卡卡奇里奇国王能够知道小凯和每个房屋的怪物的较量中的获胜概率是多少。在一场小凯和第i个房屋的怪物较量中,小凯有pi15的概率获得胜利,成功消灭第i个房屋的所有怪物,同时小凯有1−pi15的概率失败,那么第i个房屋的怪物会依旧存在,只能之后再挑战。由于没有被消灭怪物会在每个晚上恢复元气,所以每一天小凯对第i个房屋的怪物的战斗胜率是固定的。

经过了长途跋涉之后,小凯来到了卡卡奇里奇的**1号房屋**开始了战斗。每一天白天,小凯都会对当前他所在的房屋的怪物发起挑战,如果成功那么他会询问卡卡奇里奇国王然后在国王的建议之下选择一个**与当前房屋相邻的(有直接的道路相连的)**、**还存在怪物**的房屋前进(但是第二天才能对该房屋的怪物进行挑战),如果不存在这样的房屋,那么喜欢摸鱼的小凯便会**离开这个村庄**去摸鱼。如果挑战失败,那么小凯会在这个房屋门口休息一个晚上,等到下一天继续发起挑战。

国王希望摸鱼的小凯在村庄呆的久一点,所以他想问你在他的控制之下,小凯最多期望在村庄里停留多少天?请你以最简分数的形式告诉他这个答案。

Input

第一行一个整数T (1≤T≤20)​,表示数据组数。

对于每组数据,第一行有一个整数n (1≤n≤105),表示房屋的数量。

接下来有n−1行,每行两个整数u,v,表示村庄的一条道路,保证**没有重边,没有自环**。(1≤u,v≤n,u≠v)​

接下来有n个整数,第i个整数pi (1≤pi≤15)表示小凯打倒第i个村庄的怪物的概率为pi15。

数据保证∑n≤5⋅105

Output

对于每组数据,输出一个最简分数(A/B,A与B互质)表示小凯最多期望在村庄里停留多少天。数据保证答案不会为0。

解题思路:对于每一个点,小凯能够打赢的概率都是\frac{pi}{15},根据期望公式E(x)=\frac{1}{p},可以求得每个点期望。又因为每个点pi\epsilon [1,15],因此我们可以预处理这15个期望,然后再通过一遍dijkstra,去寻找最大的边就行。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pii pair<int,int>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=1e5+5;
int n;
int head[N],h[N],dis[N],vis[N],cnt=0; 
map<int,int>mp;
vector<pii> v;
struct T{
	int to,ne,w;
}s[N*4];
void init(){
	cnt=0;
	v.clear();
	for(int i=0;i<=n;i++){
		head[i]=-1;
		vis[i]=0;
		dis[i]=0;
		h[i]=0;
	}
}
void add(int u,int v,int w){
	s[cnt].w=w;
	s[cnt].to=v;
	s[cnt].ne=head[u];
	head[u]=cnt;
	cnt++;
}
struct cmp{
	bool operator()(pii x,pii y){
		return x.second<y.second; //我们需要的是最大边,所以优先队列从大到小排序。 
	}
};
void dj(){
	dis[1]=h[1];
	priority_queue<pii,vector<pii>,cmp> q;
	q.push({1,dis[1]});
	while(!q.empty()){
		int x=q.top().first;
		q.pop();
		if(vis[x]){
			continue;
		}
		vis[x]=1;
		for(int i=head[x];i!=-1;i=s[i].ne){
			if(!vis[s[i].to] && dis[s[i].to]<dis[x]+s[i].w){ //与最短路相反 
				dis[s[i].to]=dis[x]+s[i].w;
				q.push({s[i].to,dis[s[i].to]});
			}
		}
	}
}
void solve(){
	cin>>n;
	init();	//别忘了每一组数据的初始化 !!!! 
	for(int i=1;i<=n-1;i++){ //由于数据先给你的是每一条边,但是没有权值,所以先存起来 
		int a,b;
		cin>>a>>b;
		v.push_back({a,b});
	}
	for(int i=1;i<=n;i++){ //记录每一个点的期望 
		int a;
		cin>>a;
		h[i]=mp[a];
	}
	for(int i=0;i<v.size();i++){ //每一条边的花费,就可以看成是到达的点的期望 
		add(v[i].first,v[i].second,h[v[i].second]);
		add(v[i].second,v[i].first,h[v[i].first]);
	}
	dj();
	int maxx=0;
	for(int i=1;i<=n;i++){
		maxx=max(maxx,dis[i]);
	}
	int sum=__gcd(maxx,(int)360360);
	cout<<maxx/sum<<'/'<<360360/sum<<endl;
}
signed main(){
	IOS;
	for(int i=1;i<=15;i++){      //先预处理1-15的期望 
		/*由于分母会有存在3,4,5,6等等,
		而15/4等并不能除尽,为此我们需要将所有的期望进行通分。
		这时候我们就需要找到1-15的最小公倍数,也就是
		5*7*8*9*11*13=360360。
		这样就保证了分母相同,分子就可以直接相加得到结果
		最后再用答案与360360化简即可 */ 
		int x=__gcd(i,(int)360360);  
		mp[i]=15*360360/i;
	}
	int t=1;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

el-upload是一个用于上传图片的组件,而七牛云是一种云存储服务。你可以通过将这两者结合使用,实现将图片上传到七牛云的功能。 具体的步骤如下: 1. 首先,你需要从后台获取七牛云的token,这个token将用于上传图片到七牛云。你可以通过调用后端提供的接口,传入AccessKey、SecretKey和Bucket等信息来获取token。 2. 在el-upload组件中,你需要配置action属性为https://upload.qiniup.com,这是七牛云存储区域的上传地址。不同的七牛云存储区域可能会有不同的地址,请根据自己使用的七牛云服务器存储区域来确定具体的地址。 3. 配置el-upload组件的其他参数,如class、list-type、file-list等。这些参数可以根据自己的需求进行设置。 4. 在el-upload组件中,你可以监听onChange事件,以便在图片上传完成后执行相应的操作。比如,你可以在该事件中获取返回的图片路径,并将其放入el-upload组件中进行显示。 5. 当图片上传成功后,你可以在el-upload组件中使用on-success事件来回显上传的图片。你需要将回显地址配置为你在七牛云上配置的回显地址,具体地址可以参考七牛云的官方文档。 6. 最后,你可以根据需要配置其他的el-upload组件参数,如before-upload、on-remove等。 总结起来,通过el-upload组件和七牛云的配合,你可以实现在前端上传图片到七牛云,并在上传成功后进行回显操作。详情可以参考提供的引用内容中的代码和注意点。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue中el-upload上传图片到七牛的示例代码](https://download.csdn.net/download/weixin_38675465/13977470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [elementUI el-upload组件直接上传到七牛云(亲测可用)](https://blog.csdn.net/DLGDark/article/details/126763197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [el-upload上传文件到七牛云](https://blog.csdn.net/qq_42157868/article/details/107286616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值