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