比赛 |
9.27练习赛 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
观光 |
最终得分 |
100 |
用户昵称 |
小金 |
运行时间 |
1.076 s |
代码语言 |
C++ |
内存使用 |
3.66 MiB |
提交时间 |
2024-09-27 21:21:33 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,S,F,t,h[1010],v[10010],w[10010],ne[10010],tot,dis[1010][2],f[1010][2];
bool st[1010][2];
struct V{
int ver,type,dis;
bool operator > (const V&v)const
{
return dis>v.dis;
}
};
void add(int x,int y,int z)
{
tot++;
v[tot]=y;
w[tot]=z;
ne[tot]=h[x];
h[x]=tot;
}
int dijkstra()
{
memset(st,0,sizeof(st));
memset(dis,0x3f,sizeof(dis));
memset(f,0,sizeof(f));
dis[S][0]=0;
f[S][0]=1;
priority_queue<V,vector<V>,greater<V>> q;
q.push({S,0,0});
while(q.size())
{
V t=q.top();
q.pop();
int u=t.ver,type=t.type,d=t.dis,cnt=f[u][type];
if(st[u][type]) continue;
st[u][type]=true;
for(int i=h[u];i;i=ne[i])
{
int y=v[i];
if(dis[y][0]>d+w[i])
{
dis[y][1]=dis[y][0];
f[y][1]=f[y][0];
q.push({y,1,dis[y][1]});
dis[y][0]=d+w[i];
f[y][0]=cnt;
q.push({y,0,dis[y][0]});
}
else if(dis[y][0]==d+w[i])
{
f[y][0]+=cnt;
}
else if(dis[y][1]>d+w[i])
{
dis[y][1]=d+w[i];
f[y][1]=cnt;
q.push({y,1,dis[y][1]});
}
else if(dis[y][1]==d+w[i])
{
f[y][1]+=cnt;
}
}
}
int ans=f[F][0];
if(dis[F][1]==dis[F][0]+1) ans+=f[F][1];
return ans;
}
int main()
{
freopen("sightseeing.in","r",stdin);
freopen("sightseeing.out","w",stdout);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
tot=0;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
scanf("%d%d",&S,&F);
printf("%d\n",dijkstra());
}
return 0;
}