救!
查看原帖
救!
1164775
Jadonyzx楼主2024/2/28 21:47
#include<bits/stdc++.h>
#define maxn 114524
#define maxm 119999
using namespace std;
int n,val[maxn];
struct edge{
	int to,next,v,from;
}edge[maxm*2];
int head[maxn],cnt,dis[maxn],vis[maxn];
long long ans[maxn];
struct node{
	int id,dis;
	bool operator < (const node &ccf) const{
		return ccf.dis<dis;
	}
};
priority_queue<node>q;
void addedge(int from,int to,int val){
	edge[++cnt].next=head[from];
	edge[cnt].to=to;
	edge[cnt].v=val;
	head[from]=cnt;
	return;
}
signed main(){
	cin>>n;
	for(int i = 0;i < n;++i) cin>>val[i];
	int a,b,c;
	while(cin>>a>>b>>c){
		addedge(a,c,val[b]);
		edge[cnt].from=b;
		addedge(b,c,val[a]);
		edge[cnt].from=a;
	}
	for(int i = 0;i < n;++i)
		addedge(114514,i,val[i]);
	memset(dis,11451400,sizeof(dis));
	dis[114514]=0;ans[114514]=1;
	for(int i = 0;i < n;++i) ans[i]=1;
	q.push({114514,0});
	while(!q.empty()){
		node res=q.top();
		q.pop();
		int id=res.id,dist=res.dis;
		if(vis[id]) continue;
		vis[id]=1;
		for(int ioi=head[id];ioi;ioi=edge[ioi].next){
			int to=edge[ioi].to,va=edge[ioi].v;
			if(dis[to]>dist+va){
				dis[to]=dist+va;
				ans[to]=ans[id]*ans[edge[ioi].from];
				if(!vis[to])
					q.push({to,dis[to]});
			}
			else if(dis[to]==dist+va){
				ans[to]+=ans[id]*ans[edge[ioi].from];
			}
		}
	}
	cout<<dis[0]<<' '<<ans[0]/2;
	return 0;
}
2024/2/28 21:47
加载中...