Advertisement
yicongli

T165T3

Mar 31st, 2019
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll unsigned long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     T k=1;char gc;x=0;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c))x=x*10+c-'0',gc;x*=k;
  14. }
  15.  
  16. const int p1=1e9+7;
  17. const int p2=998244353;
  18. const int N=200005;
  19. const int INF=0x3f3f3f3f;
  20.  
  21. int n,m;
  22.  
  23. struct Info{
  24.     ll v1,v2,v3;
  25.     Info(){}
  26.     Info(int x){
  27.         v1=v2=v3=x;
  28.     }
  29.  
  30.     inline void operator += (const Info &a){
  31.         if((v1+=a.v1)>=p1)v1-=p1;
  32.         if((v2+=a.v2)>=p2)v2-=p2;
  33.         v3+=a.v3;
  34.     }
  35. };
  36.  
  37. namespace G1{
  38.     int ecnt;
  39.     int fir[N],nex[N],to[N],dis[N],w[N];
  40.     Info ans[N];
  41.  
  42.     inline void addedge(int u,int v,int c){
  43.         nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
  44.     }
  45.  
  46.     priority_queue<pair<int,int> >Q;
  47.  
  48.     inline void dijkstra(int S){
  49.         memset(dis+1,INF,n<<2);
  50.         ans[S]=1;
  51.         dis[S]=0;
  52.         Q.push(make_pair(0,S));
  53.         while(!Q.empty()){
  54.             int x=Q.top().second;
  55.             int d=-Q.top().first;
  56.             Q.pop();
  57.             if(d!=dis[x])continue;
  58.             for(int i=fir[x];i;i=nex[i]){
  59.                 int v=to[i];
  60.                 if(dis[v]==dis[x]+w[i]){
  61.                     ans[v]+=ans[x];
  62.                 }
  63.                 if(dis[v]>dis[x]+w[i]){
  64.                     ans[v]=ans[x];
  65.                     dis[v]=dis[x]+w[i];
  66.                     Q.push(make_pair(-dis[v],v));
  67.                 }
  68.             }
  69.         }
  70.     }
  71.  
  72.     inline void work(){
  73.         dijkstra(1);
  74.         if(dis[n]==INF)puts("-1"),exit(0);
  75.     }
  76. }
  77.  
  78. namespace G2{
  79.     int ecnt;
  80.     int fir[N],nex[N],to[N],dis[N],w[N];
  81.     Info ans[N];
  82.  
  83.     inline void addedge(int u,int v,int c){
  84.         nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
  85.     }
  86.  
  87.     priority_queue<pair<int,int> >Q;
  88.  
  89.     inline void dijkstra(int S){
  90.         memset(dis+1,INF,n<<2);
  91.         ans[S]=1;
  92.         dis[S]=0;
  93.         Q.push(make_pair(0,S));
  94.         while(!Q.empty()){
  95.             int x=Q.top().second;
  96.             int d=-Q.top().first;
  97.             Q.pop();
  98.             if(d!=dis[x])continue;
  99.             for(int i=fir[x];i;i=nex[i]){
  100.                 int v=to[i];
  101.                 if(dis[v]==dis[x]+w[i]){
  102.                     ans[v]+=ans[x];
  103.                 }
  104.                 if(dis[v]>dis[x]+w[i]){
  105.                     ans[v]=ans[x];
  106.                     dis[v]=dis[x]+w[i];
  107.                     Q.push(make_pair(-dis[v],v));
  108.                 }
  109.             }
  110.         }
  111.     }
  112.  
  113.     inline void work(){
  114.         dijkstra(n);
  115.     }
  116. }
  117.  
  118. inline bool check(const Info &a,const Info &b,const Info &c){
  119.     if(a.v1*b.v1%p1!=c.v1)return 0;
  120.     if(a.v2*b.v2%p2!=c.v2)return 0;
  121.     if(a.v3*b.v3!=c.v3)return 0;
  122.     return 1;
  123. }
  124.  
  125. int main(){
  126.     freopen("c.in","r",stdin);
  127.     freopen("c.out","w",stdout);
  128.     r(n),r(m);
  129.     for(int i=1;i<=m;++i){
  130.         int u,v,c;
  131.         r(u),r(v),r(c);
  132.         G1::addedge(u,v,c);
  133.         G2::addedge(v,u,c);
  134.     }
  135.     G1::work();
  136.     G2::work();
  137.     int ans=0;
  138.     for(int i=1;i<=n;++i){
  139.         if(G1::dis[i]+G2::dis[i]==G1::dis[n]&&check(G1::ans[i],G2::ans[i],G1::ans[n])){
  140.             ans++;
  141.         }
  142.     }
  143.     printf("%d\n",ans);
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement