Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- #include<queue>
- #define INF 2e18
- using namespace std;
- typedef long long int ll;
- struct edge{
- int u;
- int v;
- ll w;
- bool operator<(const edge &rhs)const
- {
- return w > rhs.w;
- }
- };
- edge createedge(int u,int v,ll w){
- edge temp;
- temp.u = u;
- temp.v = v;
- temp.w = w;
- return temp;
- }
- int main()
- {
- int n,m;
- ll k;
- scanf("%d %d %lld",&n,&m,&k);
- vector<edge> adj[n+1];
- for(int i=0;i<m;i++){
- int u,v;
- ll w;
- scanf("%d %d %lld",&u,&v,&w);
- adj[u].push_back(createedge(u,v,w));
- adj[v].push_back({v,u,w});
- }
- //dijkstra
- priority_queue<edge> pq;
- ll dist[n+1];for(int i=0;i<=n;i++)dist[i] = INF;
- int ctn[n+1];for(int i=0;i<=n;i++)ctn[i] = -1;
- bool visited[n+1];for(int i=0;i<=n;i++)visited[i] = false;
- dist[1] = 0;
- ctn[1] = 0;
- pq.push({0,1,dist[1]});
- while(!pq.empty()){
- int tu = pq.top().u;
- int tv = pq.top().v;
- int tw = pq.top().w;
- pq.pop();
- if(!visited[tv]){
- visited[tv] = true;
- for(int i=0;i<adj[tv].size();i++){
- int nu = adj[tv][i].u;
- int nv = adj[tv][i].v;
- int nw = adj[tv][i].w;
- if(!visited[nv] && dist[tv] + nw < dist[nv]){
- ctn[nv] = ctn[tv] + 1;
- dist[nv] = dist[tv] + nw;
- pq.push({tv,nv,nw});
- }
- }
- }
- }
- /* for(int i=1;i<=n;i++){
- printf("%d ",dist[i]);
- }printf("\n");
- for(int i=1;i<=n;i++){
- printf("%d ",ctn[i]);
- }*/
- int ans = -1;
- for(int i=1;i<=n;i++){
- if(dist[i] <= k){
- if(ctn[i] > ans){
- ans = ctn[i];
- }
- }
- }
- printf("%d",ans+1);
- }
- /*
- 5 5 4
- 1 3 2
- 2 3 1
- 2 4 1
- 2 5 2
- 3 4 4
- 5 5 0
- 1 3 2
- 2 3 1
- 2 4 1
- 2 5 2
- 3 4 4
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement