求助啊啊啊,爆零力
查看原帖
求助啊啊啊,爆零力
910357
songzhihan2010楼主2024/1/18 20:03
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<ll,ll> > edge[1001];
ll b[1001];
ll ans[1001];
ll dis[1001];
ll n;
ll u,v,w;
ll nw,sh=100000000;
priority_queue<pair<int,int> > q;
signed main(){
	scanf("%lld",&n);
	for (int i=1;i<=n;i++){
		scanf("%lld",&dis[i]);
		if(sh>dis[i]) nw=i,sh=dis[i];
		ans[i]=1;
	}
	while(scanf("%lld%lld%lld",&u,&v,&w)!=EOF){
		edge[u+1].push_back(make_pair(v+1,w+1));
		edge[v+1].push_back(make_pair(u+1,w+1));
	}
//	for (int i=1;i<=n;i++){
//		printf("%lld %lld\n",dis[i],ans[i]);
//	}
	q.push(make_pair(-dis[nw],nw));
	while(!q.empty()){
		u=q.top().second;
		q.pop();
		if(b[u]==1){
			continue;
		}
		b[u]=1;
		for (int i=0;i<edge[u].size();i++){
			v=edge[u][i].first;
			w=edge[u][i].second;
			if(!b[v]) continue;
			if(dis[w]>dis[u]+dis[v]){ 
				dis[w]=dis[u]+dis[v];
				ans[w]=ans[u]*ans[v];
				if(!b[w]) q.push(make_pair(-dis[w],w));
			}
			else if(dis[w]==dis[u]+dis[v]){
				ans[w]+=ans[u]*ans[v];
			}
		}
	}
//	for (int i=1;i<=n;i++){
//		printf("%lld %lld\n",dis[i],ans[i]);
//	}
	printf("%lld %lld",dis[1],ans[1]);
}
2024/1/18 20:03
加载中...