求调&&建议降绿
查看原帖
求调&&建议降绿
1113126
Statax楼主2024/4/16 22:12

64pts求调…

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
const int N=1005;

int n;
int vis[N],f[N];
int dis[N],cnt[N];
int trans[N][N];
vector<pii>G[N];

void Dijsktra(){
	priority_queue<pii,vector<pii>,greater<pii>>q;
	for(int i=0;i<n;i++)
		cnt[i]=1,dis[i]=f[i],
		q.push(make_pair(f[i],i));
		
	while(!q.empty()){
		int u1=q.top().second;
		q.pop();
		if(vis[u1])continue;
		vis[u1]=1;

		for(auto cur:G[u1]){
			int u2=cur.first;
			int v=cur.second;
			if(vis[u2]){
				if(f[u2]+dis[u1]<dis[v]){
					cnt[v]=cnt[u1]*cnt[u2];
					dis[v]=f[u2]+dis[u1];
					q.push(make_pair(dis[v],v));
				} 
				else if(dis[u2]+dis[u1]==dis[v])
					cnt[v]+=cnt[u1]*cnt[u2];
			}
		}
	}
	
	cout<<dis[0]<<" "<<cnt[0]<<endl;
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++)cin>>f[i];
			
	int x,y,z;
	while(cin>>x>>y>>z){
		G[x].push_back(make_pair(y,z));
		if(x==y)continue;
		G[y].push_back(make_pair(x,z));
	}
	
	Dijsktra();
	return 0;
}

建议降绿

这题基本上就一个最短路模板加一个求方案数,求方案数学点最基础的排列组合就能做,是怎么做到蓝题的?

2024/4/16 22:12
加载中...