#include #include #include using namespace std; const int maxn=10005,maxe=100005; const int inf=0x3f3f3f3f; int n,m,x,cnt,rcnt; int head[maxn],rhead[maxn],dis[maxn],rdis[maxn]; bool vis[maxn];//标记是否在队列中 struct node { int to,next,c; }e[maxe],re[maxe]; void add(node *e,int *head,int u,int v,int cc,int &cnt) { e[++cnt].to=v; e[cnt].next=head[u]; e[cnt].c=cc; head[u]=cnt; } void spfa(node *e,int *head,int u,int *dis) { queueq; memset(vis,0,sizeof(vis)); memset(dis,0x3f,maxn*sizeof(int));//数组做参数,无法用sizeof(dis)测量 // memset(dis,0x3f,(n+1)*sizeof(int));//0空间没用,按字节填充,int占4个字节,重复4次 // fill(dis+1,dis+n+1,inf);//按数组单元填充,每个元素均为inf // for(int i=1;i<=n;i++) // dis[i]=inf; vis[u]=1; dis[u]=0; q.push(u); while(!q.empty()) { int x=q.front(); q.pop(); vis[x]=0; for(int i=head[x];i;i=e[i].next) { if(dis[e[i].to]>dis[x]+e[i].c) { dis[e[i].to]=dis[x]+e[i].c; if(!vis[e[i].to]) { vis[e[i].to]=1; q.push(e[i].to); } } } } } void printg(node *e,int *head) { for(int u=1;u<=n;u++) { cout<>n>>m>>x; cnt=rcnt=0; memset(head,0,sizeof(head)); memset(rhead,0,sizeof(rhead)); int u,v,w; for(int i=1;i<=m;i++) { cin>>u>>v>>w; add(e,head,u,v,w,cnt); add(re,rhead,v,u,w,rcnt);//反向图 } //printg(e,head); spfa(e,head,x,dis); //print(dis); spfa(re,rhead,x,rdis); //print(rdis); long long ans=0; for(int i=1;i<=n;i++) ans=max(ans,(long long)dis[i]+rdis[i]); cout<