比赛 |
9.27练习赛 |
评测结果 |
AAAAAAAAAATT |
题目名称 |
观光 |
最终得分 |
83 |
用户昵称 |
dream |
运行时间 |
6.064 s |
代码语言 |
C++ |
内存使用 |
4.29 MiB |
提交时间 |
2024-09-27 21:11:17 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PI;
const int N=20005,M=100005;
int hd[N],to[M],nxt[M],val[M],dis[N],vis[N],tot;
int t,n,m,sdis,s,f,ans;
inline void read(int &x){
char c;
int sum=0,f=1;
c=getchar();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9'){
sum=sum*10+c-'0';
c=getchar();
}
x=sum*f;
}
void add(int x,int y,int v){
tot++;
to[tot]=y;
val[tot]=v;
nxt[tot]=hd[x];
hd[x]=tot;
}
void dijkstra(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
priority_queue<PI,vector<PI>,greater<PI> > q;
q.push({0,s});
dis[s]=0;
while(!q.empty()){
PI t=q.top();
q.pop();
if(vis[t.second]){
continue;
}
vis[t.second]=1;
for(int i=hd[t.second];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[t.second]+val[i]){
dis[y]=dis[t.second]+val[i];
q.push({dis[y],y});
}
}
}
sdis=dis[f];
}
int mk[N];
void dfs(int u,int sum){
if(sum>sdis+1){
return;
}
if(u==f){
if(sum==sdis+1||sum==sdis){
ans++;
}
return;
}
int flag=0;
for(int i=hd[u];i;i=nxt[i]){
int y=to[i];
if(mk[y]){
continue;
}
mk[y]=1;
dfs(y,sum+val[i]);
mk[y]=0;
}
}
int main(){
freopen("sightseeing.in","r",stdin);
freopen("sightseeing.out","w",stdout);
read(t);
while(t--){
ans=0;
read(n);
read(m);
memset(hd,0,sizeof(hd));
memset(nxt,0,sizeof(nxt));
for(int i=1;i<=m;i++){
int x,y,v;
read(x);
read(y);
read(v);
add(x,y,v);
}
read(s);
read(f);
dijkstra();
// cout<<sdis<<"\n";
dfs(s,0);
printf("%d\n",ans);
}
return 0;
}