最短路 vector不T

  1 //A vector不T
  2 // 最短路    SPFA 
  3 //  in數組
  4 
  5 #include<cstdio>
  6 #include<cstdlib>
  7 #include<cstring>
  8 #include<cmath>
  9 #include<algorithm>
 10 #include<queue>
 11 #include<stack>
 12 #include<vector>
 13 #include<deque>
 14 #include<map>
 15 #include<iostream>
 16 using namespace std;
 17 typedef long long  LL;
 18 const double pi=acos(-1.0);
 19 const double e=exp(1);
 20 //const int MAXN =2e5+10;
 21 const int N =332748118;
 22 
 23 
 24 struct edge
 25 {
 26     LL to,w;
 27 }two[100009];
 28 
 29 LL head[700009];
 30 LL dis[200009];
 31 LL in[200009];
 32 LL check[200009];
 33 
 34 vector<struct con > con[700009];
 35 queue<LL > qq;
 36 LL n;
 37 
 38 void init()
 39 {
 40     LL i,p,j;
 41 
 42     memset(head,-1,sizeof(head));
 43     memset(check,0,sizeof(check));
 44     for(i = 2; i <= n; i++)
 45     {
 46         dis[i] = 9999999999;
 47     }
 48 
 49 }
 50 
 51 void BFS()
 52 {
 53     LL i,p,j;
 54     LL x;
 55 
 56 
 57     qq.push(1);
 58     check[1] = 1;
 59     dis[1] = 0;
 60 
 61     while(!qq.empty())
 62     {
 63         x = qq.front();
 64         check[x] = 0;
 65         qq.pop();
 66 
 67         for(i = 0; i < con[x].size(); i++)
 68         {
 69             to = con[x][i].to;
 70             w = con[x][i].w;
 71             if(dis[to] > dis[x] + w)
 72             {
 73                 dis[to] = dis[x] + w;
 74                 in[to] = 1;
 75 
 76                 if(check[to] == 0)
 77                 {
 78                     check[to] = 1;
 79                     qq.push(to);
 80                 }
 81             }
 82             else if(dis[to] == dis[x] + w)
 83             {
 84                 in[to] ++;
 85             }
 86         }
 87 /*
 88         for(i = head[x]; i != -1; i = edge[i].next)
 89         {
 90 
 91           //  cout << "x: " << x << "to: " << edge[i].to << endl;
 92             if(dis[edge[i].to] > dis[x] + edge[i].w)
 93             {
 94                 dis[edge[i].to] = dis[x] + edge[i].w;
 95                 in[edge[i].to] = 1;
 96                 if(check[edge[i].to] == 0)  //沒入隊
 97                 {
 98                     check[ edge[i].to ] = 1;
 99                     qq.push( edge[i].to );
100                 }
101             }
102             else if(dis[edge[i].to] == dis[x] + edge[i].w)
103             {
104                 in[edge[i].to]++;
105             }
106 
107         }
108 */
109     }
110 //
111 //    for(i = 1; i <= n; i++)
112 //    {
113 //        cout << i << ": " << dis[i] << endl;
114 //    }
115 }
116 
117 int main()
118 {
119     LL i,p,j,t;
120     LL m,k;
121     LL a,b,c,cnt = 0;
122     struct edge mid;
123     scanf("%lld%lld%lld",&n,&m,&k);
124 
125     init();
126 
127     while(m--)
128     {
129         scanf("%lld%lld%lld",&a,&b,&c);
130 
131         mid.to = b;
132         mid.w = c;
133         con[a].push_up(mid);
134 
135         mid.to = a;
136         con[b].push_up(mid);
137 /*
138         edge[cnt].w = c;
139         edge[cnt].to = b;
140         edge[cnt].next = head[a];
141         head[a] = cnt++;
142 
143         edge[cnt].w = c;
144         edge[cnt].to = a;
145         edge[cnt].next = head[b];
146         head[b] = cnt++;
147 */
148     }
149 
150     for(i = 0; i < k; i++)
151     {
152         scanf("%lld%lld",&b,&c);
153 
154         two[i].to = b;
155         two[i].w = c;
156 
157         mid.to =  b;
158         mid.w = c;
159         con[1].push_up(mid);
160 /*
161         edge[cnt].w =  c;
162         edge[cnt].to = b;
163         edge[cnt].next = head[1];
164         head[1] = cnt++;
165 */
166     }
167 
168     BFS();
169     LL ans = 0;
170     for(i = 0; i < k; i++)
171     {
172         if(dis[ two[i].to ] < two[i].w)
173         {
174             ans ++;
175         }
176         else if(dis[ two[i].to ] == two[i].w && in[ two[i].to ] > 1)
177         {
178             ans++;
179             in[ two[i].to ]--;
180         }
181        // cout << "i: " << con[i].to << " dis: " << dis[ con[i].to ] << " in: " << in[ con[i].to ] << endl;
182     }
183     printf("%lld\n",ans);
184     return 0;
185 
186 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章