全WA
查看原帖
全WA
1424375
s_z_x楼主2024/11/3 20:40

思路: 先将所有经过亲戚的顺序求出来(120种),再进行Dijkstra最短路处理。

#include<bits/stdc++.h>
#define ll long long
#define N 1000100
using namespace std;
ll n,m,head[N],to[N],net[N],w[N],d[N],E,position[N],vis[N],v,ans1,sum=1e9;
ll f[N],ans[100010][100],cnt,a[1000];
void add(int a,int b,int c){
	to[E] = b;
	net[E] = head[a];
	head[a] = E;
	w[E] = c;
	E++;
}
void dfs(int now){
	if(now==n){
		cnt++;
		for(int i=1;i<=5;i++){
			ans[cnt][i]=a[i];
		}
		return ;
	}
	for(int i=1;i<=5;i++){
		if(f[position[i]]==0){
			f[position[i]]=1;
			a[now]=position[i];
			dfs(now+1);
			f[position[i]]=0;
		}
	}
}
struct node{
	ll dis,u;
	bool operator<(const node & cmp) const{
		return dis>cmp.dis;
	}
};
void init(){
	memset(head,-1,sizeof(head));
	E = 0;
}
priority_queue<node>q;
ll time(int x,int y){
	for(int i=1;i<=n+1;i++) d[i]=1e9;
	node s;
	s.dis=0;
	s.u=x;
	d[x]=0;
	q.push(s);
	while(!q.empty()){
		node f=q.top();q.pop();
		int u=f.u;
		for(int i=head[u];i!=-1;i=net[i]){
			int v=to[i];
			if(d[v]>d[u]+w[i]){
				d[v]=d[u]+w[i];
				node g;g.dis=d[v];g.u=v;
				q.push(g);
			}
		}
	}
	return d[y];
}
int main(){
	init();
	scanf("%lld%lld",&n,&m);
	for(int i = 1; i<=5; i++) scanf("%lld",&position[i]);
	for(int i = 1; i<=m; i++){
		ll x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	ll last=1;
	dfs(1);
	for(int i=1;i<=cnt;i++){
		ans1=0,last=1;
		for(int j=1;j<=5;j++){
			ans1+=time(last,ans[i][j]);
			last=ans[i][j];
		}
		sum=min(ans1,sum);
	}
	printf("%lld",sum);
	return 0;
}

调了一个小时,实在调不出来,求dalao帮忙(回复必关)

2024/11/3 20:40
加载中...