#include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #define INF 3000000 int tot,n,m,s,t,x,y,xx,yy,ans; int head[80000],dist[80000],cost[80000],nxt[80000],v[80000],dis[300][30000]; bool flag,vis[300][30000]; struct route{ int x,y,d; bool operator > (const route n) const {return d>n.d;} }; priority_queue< route,vector<route>,greater<route> > h; void add(int x,int y,int xx,int yy){ tot++; v[tot]=y; dist[tot]=xx; cost[tot]=yy; nxt[tot]=head[x]; head[x]=tot; } void dijkstra(int s,int t){ for (int i=1;i<=n;i++) for (int j=0;j<=10000;j++) dis[i][j]=INF; h.push((route){s,0,0}); dis[s][0]=0; while (!h.empty()){ int x=h.top().x,y=h.top().y,d=h.top().d; h.pop(); for (int j=head[x];j;j=nxt[j]) if (dis[v[j]][y+cost[j]]>d+dist[j]){ dis[v[j]][y+cost[j]]=d+dist[j]; h.push((route){v[j],y+cost[j],dis[v[j]][y+cost[j]]}); } } return; } int main(){ scanf("%d%d%d%d",&n,&m,&s,&t); for (int i=1;i<=m;i++){ scanf("%d%d%d%d",&x,&y,&xx,&yy); add(x,y,xx,yy); add(y,x,xx,yy); } dijkstra(s,t); int MIN=INF; for (int i=0;i<=10000;i++) if (dis[t][i]<MIN){ans++; MIN=dis[t][i];} printf("%d\n",ans); return 0; }
|