由于是无向图,所以可以枚举两个终点,跑两次最短路来更新答案.
#include
#include
#include
#include
#define N 100006
#define M 200007
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
deque
int n,m,A,B,C,edges;
int hd[N],to[M<<1],nex[M<<1],val[M<<1],d[2][M],inq[2][M];
void addedge(int u,int v,int c)
{ nex[&#43;&#43;edges]&#61;hd[u],hd[u]&#61;edges,to[edges]&#61;v,val[edges]&#61;c;
}
void spfa(int s,int t)
{ // printf("%d\n",s); memset(d[t],0x3f,sizeof(d[t])); memset(inq[t],0,sizeof(inq[t])); d[t][s]&#61;0, inq[t][s]&#61;1, q.push_back(s); for(;!q.empty();) {int u&#61;q.front(); q.pop_front(); inq[t][u]&#61;0; for(int i&#61;hd[u];i;i&#61;nex[i]) { int v&#61;to[i]; if(d[t][u] &#43; val[i]
int main()
{ int i,j; // setIO("input"); scanf("%d%d%d%d%d",&m,&n,&A,&B,&C); for(i&#61;1;i<&#61;m;&#43;&#43;i) {int a,b,c; scanf("%d%d%d",&a,&b,&c), addedge(a,b,c), addedge(b,a,c); } spfa(B, 0); // printf("%d %d\n",d[0][A],d[0][C]); spfa(C, 1); printf("%d\n",min(d[0][A] &#43; d[0][C], d[1][A] &#43; d[1][B])); return 0;
}