这题用Dijkstra为什么会WA60呢?
查看原帖
这题用Dijkstra为什么会WA60呢?
305891
Eraine楼主2021/3/1 19:48

一道黄题……

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
long long n,m,relative[8],num[50005],judge[50005],tot,dijkstra[8][50005],judge_dfs[8],minx=0x3f3f3f3f,s,now;
struct node{
	long long end;
	long long len;
	long long next;
}edge[200005];
priority_queue<pair<long long,int> >que;
void search_dfs(int step,long long sum,int nows){
	if(sum>=minx)return;
	if(step==6){
		minx=min(minx,sum);
		return;
	}
	for(int i=2;i<=6;i++){
		if(judge[i])continue;
		judge[i]=1;
		search_dfs(step+1,sum+dijkstra[nows][relative[i]],i);
		judge[i]=0;
	}
}
void graph_Dijkstra(){
	while(!que.empty())que.pop();
	memset(judge,0,sizeof(judge));
	dijkstra[now][s]=0;
	que.push(make_pair(0,s));
	while(!que.empty()){
		int x=que.top().second;
		que.pop();
		if(judge[x])continue;
		judge[x]=1;
		for(int i=num[x];i;i=edge[i].next){
			if(dijkstra[now][edge[i].end]>dijkstra[now][x]+edge[i].len){
				dijkstra[now][edge[i].end]=dijkstra[now][x]+edge[i].len;
				que.push(make_pair(-dijkstra[now][edge[i].end],edge[i].end));
			}
		}
	}
}
void add(int start,int end,long long len){
	edge[++tot].end=end;
	edge[tot].len=len;
	edge[tot].next=num[start];
	num[start]=tot;
}
int main(){
	memset(dijkstra,0x3f,sizeof(dijkstra));
	scanf("%d%d",&n,&m);
	relative[1]=1;
	for(int i=2;i<=6;i++)scanf("%d",&relative[i]); 
	for(int i=1;i<=m;i++){
		int lin_a,lin_b,lin_c;
		scanf("%d%d%d",&lin_a,&lin_b,&lin_c);
		add(lin_a,lin_b,lin_c);
		add(lin_b,lin_a,lin_c);
	}
	for(int i=1;i<=6;i++){
		now=i;
		s=relative[now];
		graph_Dijkstra();
	}
	for(int i=2;i<=6;i++){
		judge[i]=1;
		search_dfs(2,dijkstra[1][relative[i]],i);
		judge[i]=0;
	}
	printf("%lld",minx);
	return 0;
}
2021/3/1 19:48
加载中...