比赛 |
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);
}
}