dijkstra+dfs T3个点求调
查看原帖
dijkstra+dfs T3个点求调
1163890
sjzsd147楼主2024/4/2 19:31

堆优化dijkstra+dfs,t了3个点,求调

#include<bits/stdc++.h>
using namespace std;
int n,m,dis[6][50005];
int station[6]={1};
int head[50005],tote;
bool vis[50005],dfsvis[6];
struct edge{
	int to,val,nex;
}e[100005];
void addedge(int x,int y,int t){
	e[++tote].to=y; e[tote].val=t;
	e[tote].nex=head[x];
	head[x]=tote;
	return;
}
struct node{
	int id;
	int dis;
	node(int idd,int diss){
		id=idd; dis=diss;
	}
};
bool operator<(node x,node y){
	return x.dis>y.dis;
}
priority_queue<node>q;
int ans=1e9;
void dfs(int x,int y){
	if(y>ans){
		return;
	}
	bool flag=0;
	for(int i=0;i<=5;i++){
		if(dfsvis[i]) continue;
		flag=1;
		dfsvis[i]=1;
		dfs(i,y+dis[x][station[i]]);
		dfsvis[i]=0;
	}
	if(!flag){
		ans=min(ans,y);
	}
	return;
}
int main(){
	memset(head,-1,sizeof(head));
	memset(dis,0x3f,sizeof(dis));
	cin>>n>>m;
	for(int i=1;i<=5;i++) cin>>station[i];
	for(int i=1,x,y,t;i<=m;i++){
		scanf("%d%d%d",&x,&y,&t);
		addedge(x,y,t);
		addedge(y,x,t);
	}
	for(int j=0;j<=5;j++){
		memset(vis,0,sizeof(vis));
		q.push(node(station[j],0));
		dis[j][station[j]]=0;
		while(!q.empty()){
			node tmp=q.top();
			q.pop();
			if(!vis[tmp.id]){
				vis[tmp.id]=1;
				for(int i=head[tmp.id];i!=-1;i=e[i].nex){
					if(dis[j][e[i].to]>dis[j][tmp.id]+e[i].val){
						dis[j][e[i].to]=dis[j][tmp.id]+e[i].val;
						q.push(node(e[i].to,dis[j][e[i].to]));
					}
				}
			}
		}
	}
	dfsvis[0]=1;
	dfs(0,0);
	cout<<ans;
	return 0; 
} 
2024/4/2 19:31
加载中...