比赛 9.27练习赛 评测结果 AAAAAAAAAAAA
题目名称 观光 最终得分 100
用户昵称 KKZH 运行时间 2.608 s
代码语言 C++ 内存使用 4.22 MiB
提交时间 2024-09-27 20:52:09
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
struct AI{
	long long zhi,zhong;
};
struct node{
	long long hao,zhi;
	friend bool operator<(const node a,const node b)
    {
        return a.zhi>b.zhi;
    }
};
long long n,s,e,w,d[20010],t,ans=0;
vector <AI> a[20010];
bool f[20010],res[20010];
void dfs(int k,int z){
	if(z>d[e]+1){
		return;
	}
	if(k==e&&(z==d[e]||d[e]+1)){
		ans++;
	}
	else{
		for(int i=0;i<a[k].size();i++){
			if(res[a[k][i].zhong]==0){
				res[a[k][i].zhong]=1;
				dfs(a[k][i].zhong,z+a[k][i].zhi);
				res[a[k][i].zhong]=0;	
			}
		}
	}
}
priority_queue <node> q; 
int main(){
	freopen("sightseeing.in","r",stdin);
	freopen("sightseeing.out","w",stdout);
	scanf("%d",&t);
	for(int ii=1;ii<=t;ii++){
		ans=0; 
		cin>>n>>w;
		for(long long i=1;i<=w;i++){
			long long r;
			cin>>r;
			long long o,x;
			cin>>o>>x;
			a[r].push_back({x,o});
		}
		cin>>s>>e;
		memset(d,0x7f,sizeof(d));
		memset(f,0,sizeof(f)); 
		long long h;
		d[s]=0;
		q.push({s,d[s]});
		while(!q.empty()) {
			h=q.top().hao;
			q.pop();
			if(f[h]){
				continue;
			}
			f[h]=true;
			if(h==e){
				break;
			}
			for(long long j=0;j<a[h].size();j++){
				if(d[a[h][j].zhong]>d[h]+a[h][j].zhi){
					d[a[h][j].zhong]=d[h]+a[h][j].zhi;
					q.push({a[h][j].zhong,d[a[h][j].zhong]});
				}
			}
		}
		dfs(s,0);
		cout<<ans<<endl;
		for(int i=1;i<=n;i++){
			a[i].clear();
		}
		while(!q.empty()){
			q.pop();
		} 
	}
	return 0;
}