比赛 9.27练习赛 评测结果 AAAAAAAAAAAA
题目名称 观光 最终得分 100
用户昵称 123 运行时间 1.220 s
代码语言 C++ 内存使用 5.92 MiB
提交时间 2024-09-27 20:09:02
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=200010;
int t,head[N],idx[N],nxt[N],val[N],n,m,dis[N],vis[N],tot=0,u,v,ret=0;
void add(int x,int y,int z)
{
	idx[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}
void dijstra(int s)
{
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
	dis[s]=0;
	q.push(make_pair(0,s));
	while (!q.empty())
	{
		int t=q.top().second;q.pop();
		if (vis[t]) continue;
		vis[t]=1;
		for (int i=head[t];i;i=nxt[i])
		{
			int y=idx[i];
			if (dis[y]>dis[t]+val[i])
			{
				dis[y]=dis[t]+val[i]; 
				if(!vis[y])q.push(make_pair(dis[y],y));
			}
		}
	}
}
void dfs(int now,int len)
{
	for (int i=head[now];i;i=nxt[i])
	{
		int y=idx[i];
		if (!vis[y] && len+val[i]<=dis[v]+1)
		{
			if (y==v)
			{
				if (len+val[i]==dis[v] || len+val[i]==dis[v]+1)
				{
					ret++;
				}
				continue;
			}
			vis[y]=1;
			dfs(y,len+val[i]);
			vis[y]=0;
		}
	}
}
int main() {
	freopen("sightseeing.in","r",stdin);
	freopen("sightseeing.out","w",stdout);
	scanf("%d",&t);
	while(t--)
	{
		memset(dis,0x3f,sizeof(dis));
		memset(vis,0,sizeof(vis));
		memset(head,0,sizeof(head));
		ret=0,tot=0;
		scanf("%d%d",&n,&m);
		for (int i=1;i<=m;i++) 
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);
		}
		scanf("%d%d",&u,&v);
		dijstra(u);
		memset(vis,0,sizeof(vis));
		dfs(u,0);
		printf("%d\n",ret);
	}
}