有个问题
查看原帖
有个问题
681941
OIer_Hhy楼主2024/8/3 19:34

0pts:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5;
int n,u,v,w,mp[N][N],vis[N],dis[N],cnt[N];
void addedge(int u,int v,int w){mp[u][v]=w;} 
void dijkstra(){
	for(int i=0;i<n;i++){
		int k=n;
		for(int j=0;j<n;j++){
			if(!vis[j]&&dis[k]>dis[j]) k=j;
		}
		vis[k]=1; 
		for(int j=0;j<n;j++){
			if(vis[j]&&mp[k][j]){
				if(dis[j]+dis[k]==dis[mp[k][j]]) cnt[mp[k][j]]+=cnt[j]*cnt[k];
				if(dis[mp[k][j]]>dis[j]+dis[k]){
					dis[mp[k][j]]=dis[j]+dis[k];
					cnt[mp[k][j]]=cnt[j]*cnt[k];
				}
			}
		}
			
	}
}
signed main(){
	cin>>n;
	dis[n]=1e9;
	for(int i=0;i<n;i++) cin>>dis[i],cnt[i]=1;
	while(cin>>u>>v>>w){
		addedge(u,v,w);
		addedge(v,u,w);
	}
	dijkstra();
	cout<<dis[0]<<' '<<cnt[0]<<endl;
	return 0;
}

100pts code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5;
int n,u,v,w,mp[N][N],vis[N],dis[N],cnt[N];
void addedge(int u,int v,int w){mp[u][v]=w;} 
void dijkstra(){
	for(int i=1;i<=n;i++){
		int k=0;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&dis[k]>dis[j]) k=j;
		}
		vis[k]=1; 
		for(int j=1;j<=n;j++){
			if(vis[j]&&mp[k][j]){
				if(dis[j]+dis[k]==dis[mp[k][j]]) cnt[mp[k][j]]+=cnt[j]*cnt[k];
				if(dis[mp[k][j]]>dis[j]+dis[k]){
					dis[mp[k][j]]=dis[j]+dis[k];
					cnt[mp[k][j]]=cnt[j]*cnt[k];
				}
			}
		}
			
	}
}
signed main(){
	cin>>n;
	dis[0]=1e9;
	for(int i=1;i<=n;i++) cin>>dis[i],cnt[i]=1;
	while(cin>>u>>v>>w){
		addedge(u+1,v+1,w+1);
		addedge(v+1,u+1,w+1);
	}
	dijkstra();
	cout<<dis[1]<<' '<<cnt[1]<<endl;
	return 0;
}

为什么偏要从 11 开始存?

2024/8/3 19:34
加载中...