样例可以过,但是WA咧,球球帮忙看看
#include <bits/stdc++.h>
using namespace std;
inline long long read() {
long long x;bool f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
inline void print(long long x,char las) {
if(!x) {
putchar('0'),putchar(las);
return ;
}
if(x<0) putchar('-'),x=-x;
int ls[23],k=0;
while(x) ls[++k]=x%10,x/=10;
while(k) putchar(ls[k--]+48);
putchar(las);
return ;
}
struct edge {
int to,len;
edge *next;
};
struct gra {
int rs;
edge rd[600000],*head[200001];
inline void add(int u,int v,int l) {
rd[rs].to=v;rd[rs].len=l;rd[rs].next=head[u];head[u]=&rd[rs++];
}
}gg;
struct graph {
int rs;
edge rd[300000],*head[200001];
inline void add(int u,int v) {
rd[rs].to=v;rd[rs].next=head[u];head[u]=&rd[rs++];
}
}g1,g2,g3;
struct node {
int name;long long dis=LLONG_MAX;
inline bool operator<(const node &ls) const {
return dis>ls.dis;
}
}nd[200001];
int n=read(),m=read(),s=read(),line[200001],h,t,du[200001],f[20][200001],deep[200001],ans,mx;
priority_queue<node>q1;
bitset<200001>us;
inline int LCA(int u,int v) {
if(deep[u]<deep[v]) swap(u,v);
for(int i=19;i>=0;i--) if(deep[f[i][u]]>=deep[v]) u=f[i][u];
if(u==v) return u;
for(int i=19;i>=0;i--) if(f[i][u]!=f[i][v]) u=f[i][u],v=f[i][v];
return f[0][u];
}
inline int find(int x) {
int res=1;
for(edge *i=g3.head[x];i;i=i->next) res+=find(i->to);
if(res>mx && x!=s) mx=res,ans=x;
return res;
}
int main() {
for(int i=1;i<=m;i++) {
int u=read(),v=read(),l=read();
gg.add(u,v,l);gg.add(v,u,l);
}
nd[s].name=s;
nd[s].dis=0;q1.push(nd[s]);
while(!q1.empty()) {
node now=q1.top();q1.pop();
if(us[now.name]) continue;
us[now.name]=1;
for(edge *i=gg.head[now.name];i;i=i->next) {
if(us[i->to]) continue;
if(i->len+now.dis<nd[i->to].dis) nd[i->to].name=i->to,nd[i->to].dis=i->len+now.dis,q1.push(nd[i->to]);
}
}
line[++t]=s;
while(h<t) {
int now=line[++h];
for(edge *i=gg.head[now];i;i=i->next) {
if(i->len+nd[now].dis==nd[i->to].dis) {
g1.add(i->to,now),g2.add(now,i->to),du[i->to]++;
line[++t]=i->to;
}
}
}
h=t=0;
for(int i=1;i<=n;i++) if(!du[i]) line[++t]=i;
while(h<t) {
int now=line[++h],lca=0;bool k=false;
for(edge *i=g1.head[now];i;i=i->next)
if(!k) lca=i->to,k=true;
else lca=LCA(lca,i->to);
g3.add(lca,now);
f[0][now]=lca;deep[now]=deep[lca]+1;
for(int i=1;i<20;i++) f[i][now]=f[i-1][f[i-1][now]];
for(edge *i=g2.head[now];i;i=i->next) if(--du[i->to]==0) line[++t]=i->to;
}
find(s);
print(ans,'\n');
return 0;
}