CF 144D Missile Silos [最短路+想法]

来源:互联网 发布:如何挑选电视机知乎 编辑:程序博客网 时间:2024/05/25 05:36

题意:

给出一张图和图上的一个顶点,求距离这个点距离为s(最短距离)的顶点或边上的点总共有几个(边上的点要保证也是最短距离)


分析:

先用DIJ求出最短路

然后对所有顶点,距离为s的点都算上


枚举每条边

边上的两个顶点如果距离不够,则看在边上能不能找到一个点,顶点上的距离加上这个顶点到点的距离能为s(注意保证这个距离是最小距离(即这个点通过另外一端的顶点距离源点的距离小大于这个s))。数出这样的点的个数,加上。注意重合点的情况,有的边上一个这样的点都没有,有的只有1个,有的有两个点,有的两个点重合

#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#include <vector>#include <queue>#include <climits>#define pb push_backusing namespace std;int dis;int cnt=0;const int INF=INT_MAX;const int MAX_V=111111;struct edge{int from,to,cost,rev,mid;}ed[MAX_V];typedef pair<int,int>P;int V;vector<edge> G[MAX_V];int d[MAX_V];int vis[MAX_V];int ednum;void dijkstra(int s){priority_queue<P,vector<P>,greater<P> > que;fill(d+1,d+V+1,INF);d[s]=0;que.push(P(0,s));while(!que.empty()){P p=que.top();que.pop();int v=p.second;if(d[v]<p.first) continue;for(int i=0;i<G[v].size();i++){edge e=G[v][i];if(d[e.to]>d[v]+e.cost){d[e.to]=d[v]+e.cost;que.push(P(d[e.to],e.to));}}}}int main(){#ifndef ONLINE_JUDGEfreopen("G:/in.txt","r",stdin);//freopen("G:/myout.txt","w",stdout);#endifint n,m,s;cin>>n>>m>>s;V=n;for(int i=1;i<=m;i++){int u,v,l;cin>>u>>v>>l;G[u].pb((edge){u,v,l,G[v].size(),0});G[v].pb((edge){v,u,l,G[u].size()-1,0});ed[ednum++]=(edge){u,v,l,0,0};}cin>>dis;dijkstra(s);//dij求出最短路for(int i=1;i<=n;i++)        if(d[i]==dis) cnt++;//顶点上的个数for(int i=0;i<ednum;i++){            int fr=ed[i].from;            int to=ed[i].to;            int cost=ed[i].cost;            bool flag=false;            if(d[fr]<dis){                if(d[fr]+ed[i].cost>dis){                    if(d[to]+ed[i].cost-(dis-d[fr])>dis){//保证这端是最短路                        cnt++;                    }else if(d[to]+ed[i].cost-(dis-d[fr])==dis){                        flag=true;//点重合                        cnt++;                    }                }            }            if(d[to]<dis){                if(!flag){//点不重合的时候才算另外一个顶点                    if(d[fr]+ed[i].cost-(dis-d[to])>dis){                            cnt++;                    }                }            }}cout<<cnt<<endl;}


0 0
原创粉丝点击