求助,TLE60分,不知道哪里有问题。
查看原帖
求助,TLE60分,不知道哪里有问题。
251660
Ian8877楼主2023/6/21 13:05
#include<bits/stdc++.h>
#define maxn 1005
#define maxm 10000005
#define ll long long
using namespace std;
int n;
ll a[maxn];
ll dis[maxn],c[maxn];
ll bj[maxn];
int head[maxn],to[maxm],nex[maxm],to1[maxn],n1;
void add(int u,int v,int w) {
	to[++n1]=v;
	nex[n1]=head[u];
	to1[n1]=w;
	head[u]=n1;
}
priority_queue<pair<ll,int> > q;
void dij() {
	for(int i=0;i<n;i++) {
		dis[i]=a[i];
		bj[i]=1;
		c[i]=0;
	}
	for(int i=0;i<n;i++) {
		q.push(make_pair(-dis[i],i));
	}
	while(!q.empty()) {
		int len=-q.top().first,now=q.top().second;
		q.pop();
		if(len!=dis[now]) continue;
		c[now]=1;
		for(int i=head[now];i;i=nex[i]) {
			int st=to[i],st1=to1[i];
			if(c[st]) {
				if(dis[now]+dis[st]<dis[st1]) {
					dis[st1]=dis[now]+dis[st];
					bj[st1]=bj[now]*bj[st];
					q.push(make_pair(-dis[st1],st1));
				}
				else if(dis[now]+dis[st]==dis[st1]) bj[st1]+=bj[now]*bj[st];
			}
		}
	}
	printf("%lld %lld\n",dis[0],bj[0]);
}
int main() {
//	freopen("P1875.in","r",stdin);
//	freopen("P1875.out","w",stdout);
	scanf("%d",&n);
	for(int i=0;i<n;i++) {
		scanf("%lld",&a[i]);
	}
	int u1,u2,v;
	while(scanf("%d%d%d",&u1,&u2,&v)!=EOF){
		add(u1,u2,v);
		if(u1==u2)continue;
		add(u2,u1,v);
	}
	dij();
	return 0;
}
2023/6/21 13:05
加载中...