比赛 9.27练习赛 评测结果 AAAAAAAAAAAA
题目名称 观光 最终得分 100
用户昵称 flyfree 运行时间 1.258 s
代码语言 C++ 内存使用 3.97 MiB
提交时间 2024-09-27 20:39:09
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 100010
#define N 1000000000
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
ll idx,n,m,S,F,T;
ll hd[MAXN],ed[MAXN*2],nxt[MAXN*2],val[MAXN*2],st[MAXN*2],s[MAXN*2];
ll dis1[MAXN],dis2[MAXN],dp[MAXN][5],rd[MAXN],used[MAXN],dfn[MAXN];
struct node1{
	ll id;
	bool operator <(const node1 &a)const{
		return dis1[id]>dis1[a.id];
	}
};
struct node2{
	ll id;
	bool operator <(const node2 &a)const{
		return dis2[id]>dis2[a.id];
	}
};
void build(ll x,ll y,ll z){
	nxt[++idx]=hd[x];
	ed[idx]=y;
	hd[x]=idx;
	val[idx]=z;
	st[idx]=x;
}
void clear_(){
	while(idx){
		s[idx]=st[idx]=nxt[idx]=0,ed[idx]=0,hd[idx]=0;
		idx--;
	}
	for(int i=1;i<=n;i++){
		dis1[i]=dis2[i]=N;
		used[i]=rd[i]=dp[i][1]=dp[i][2]=dfn[i]=0;
	}
}
void dij1(){
	priority_queue<node1> q;
	dis1[S]=0;
	q.push((node1){S});
	while(!q.empty()){
		ll fst=q.top().id;
		q.pop();
		if(used[fst])continue;
		used[fst]=1;
		for(int i=hd[fst];i;i=nxt[i]){
			if((i&1)==0)continue;
			ll y=ed[i];
			if(used[y])continue;
			dis1[y]=min(dis1[y],dis1[fst]+val[i]);
			q.push((node1){y});
		}
	}
}
void dij2(){
	priority_queue<node2> q;
	dis2[F]=0;
	q.push((node2){F});
	while(!q.empty()){
		ll fst=q.top().id;
		q.pop();
		if(used[fst])continue;
		used[fst]=1;
		for(int i=hd[fst];i;i=nxt[i]){
			if((i&1)==1)continue;
			ll y=ed[i];
			if(used[y])continue;
			dis2[y]=min(dis2[y],dis2[fst]+val[i]);
			q.push((node2){y});
		}
	} 
}
int main(){
	freopen("sightseeing.in","r",stdin);
	freopen("sightseeing.out","w",stdout);
	T=read();
	for(int i=1;i<=1000;i++){
		dis1[i]=dis2[i]=N;
	}
	while(T--){
		n=read(),m=read();
		for(int i=1;i<=m;i++){
			ll x=read(),y=read(),z=read();
//			rd[y]++;
			build(x,y,z);
			build(y,x,z);
		}
		S=read(),F=read();
		dij1();
		for(int i=1;i<=n;i++)used[i]=0;
		dij2();
		for(int i=1;i<=n;i++)used[i]=0;
		for(int i=1;i<=n;i++)if(dis1[i]+dis2[i]<=dis1[F]+1){
			dfn[i]=1;
//			cout<<i<<endl;
		}
		queue <int> q;
//		q.push(S); 
		for(int i=1;i<=idx;i+=2){
			if(dis1[st[i]]+val[i]+dis2[ed[i]]<=dis1[F]+1){
				rd[ed[i]]++;
				s[i]=1;
//				cout<<st[i]<<" "<<ed[i]<<endl;
			}
		}
//		for(int i=1;i<=n;i++)cout<<rd[i]<<endl;
		for(int i=1;i<=n;i++)used[i]=0;
		used[S]=1;
		q.push(S);
		dp[S][1]=1;
		while(!q.empty()){
			ll fst=q.front();
//			cout<<fst<<" "<<dp[fst][1]<<" "<<dp[fst][2]<<endl;
			q.pop();
			used[fst]=1;
			for(int i=hd[fst];i;i=nxt[i]){
				if((i&1)==0)continue;
				ll y=ed[i];
				if(used[y]||!dfn[y]||!s[i])continue;
				rd[y]--;
				if(dis1[fst]+val[i]==dis1[y])dp[y][1]+=dp[fst][1],dp[y][2]+=dp[fst][2];
				if(dis1[fst]+val[i]+1==dis1[y])dp[y][1]+=dp[fst][2];
				if(dis1[fst]+val[i]==dis1[y]+1)dp[y][2]+=dp[fst][1];
				if(!rd[y]){
					used[y]=1;
					q.push(y);
				}
			}
		}
		cout<<dp[F][1]+dp[F][2]<<endl;
		clear_();
	}
	return 0;
}