请求dalao验证思路与代码,样例ok
查看原帖
请求dalao验证思路与代码,样例ok
728840
covonant楼主2024/12/3 13:34

思路:建立一个虚拟点,并将虚拟点链接所有节点 以虚拟点为单源,dijkstra

感觉没问题但0pts

#include<bits/stdc++.h>
#define maxn 1010
#define S 1005
#define inf (1ull<<63)-1
#define LL unsigned long long 
#define maxm 1000005
using namespace std;
priority_queue<pair<LL,LL> >q;
LL dis[maxn],vis[maxn],h[maxn];
LL to[maxm],val[maxm],nxt[maxm];
LL cost[maxn],cnt,n;
LL ans[maxn];
void addedge(LL a,LL b,LL c){
	cnt++;
	to[cnt]=b;
	val[cnt]=c;
	nxt[cnt]=h[a];
	h[a]=cnt;
}
void dijkstra(){
	for(int i=0;i<n;i++) dis[i]=inf;
	dis[S]=0;
	ans[S]=1;
	q.push({0,S});
	while(!q.empty()){
		LL u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(LL i=h[u];i;i=nxt[i]){
			if(!vis[to[i]]){
				if(dis[to[i]]==dis[u]+val[i]){
					ans[to[i]]+=ans[u];
				}
				else if(dis[to[i]]>dis[u]+val[i]){
					dis[to[i]]=dis[u]+val[i];
					ans[to[i]]=ans[u];
					q.push({-dis[to[i]],to[i]});
				}
			}
		}
	}
}
int main(){
	cin>>n;
	for(LL i=0;i<n;i++){
		cin>>cost[i];
	}
	LL a,b,c;
	while(cin>>a>>b>>c){
		addedge(a,c,cost[b]);
		addedge(b,c,cost[a]);
	}
	for(LL i=0;i<n;i++){
        addedge(S,i,cost[i]);
	}
	dijkstra();
	cout<<dis[0]<<" "<<ans[0];
	return 0;
}
2024/12/3 13:34
加载中...