Codeforces 144D. Missile Silos【dijkstra】

题目大意:

给出一个图,一个源点s,问距离这个源点的最短距离恰好为 l 的点有多少个(这个点可以在边上,可以在节点上)。

做法:

首先用dijkstra算法求出每个节点到s的最短路d[]数组,然后对于每条边w(u,v)来说有下面三种情况是合法的:

1:d[u]<l && l-d[u]<w(u,v) && d[v]+w(u,v)-(l-d[u])>l

2:d[v]<l && l-d[v]<w(u,v) && d[u]+w(u,v)-(l-d[v])>l

3:d[v]<l && d[u]<l && d[u]+d[v]+w(u,v)==2*l

对于上面每种情况,ans++,另外每个d[i]==l 的情况也要ans++;

代码:

#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
#include <climits>
#include <algorithm>
#define N 100010
const int INF=INT_MAX;
using namespace std;
struct edge
{
    int from,to,c;
    edge(int a,int b)
    {
        to=a,c=b;
    }
    edge()
    {
        from=0,to=0,c=0;
    }
};
edge e[N];
typedef pair<int,int> p;
int V;
vector <edge> G[N*2];
int d[N];
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 pp=que.top();que.pop();
        int v=pp.second;
        if(d[v]<pp.first) continue;
        for(int i=0;i<G[v].size();i++){
            edge e=G[v][i];
            if(d[e.to]>d[v]+e.c)
            {
                d[e.to]=d[v]+e.c;
                que.push(p(d[e.to],e.to));
            }
        }
    }
}
int main()
{
    int m,l,s;
    int ans=0;
    scanf("%d%d%d",&V,&m,&s);
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        G[a].push_back(edge(b,c));
        G[b].push_back(edge(a,c));
        e[i].from=a,e[i].to=b,e[i].c=c;
    }
    scanf("%d",&l);
    dijkstra(s);
    for(int i=0;i<m;i++)
    {
        int u=e[i].from,v=e[i].to,cost=e[i].c;
        if(d[u]<l && l-d[u]<cost && d[v]+cost-(l-d[u])>l) ans++;
        if(d[v]<l && l-d[v]<cost && d[u]+cost-(l-d[v])>l) ans++;
        if(d[u]<l && d[v]<l && d[u]+d[v]+cost==2*l) ans++;
    }
    for(int i=1;i<=V;i++)
        if(d[i]==l) ans++;
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-03 09:30:45

Codeforces 144D. Missile Silos【dijkstra】的相关文章

codeforces 144D Missile Silos(最短路)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Missile Silos A country called Berland consists of n cities, numbered with integer numbers from 1 to n. Some of them are connected by bidirectional roads. Each road has some length. There is

HDU2680 Choose the best route 【Dijkstra】

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7061    Accepted Submission(s): 2300 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

HDU1874 畅通工程续 【Dijkstra】

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 26970    Accepted Submission(s): 9719 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走

HDU2544 最短路 【Dijkstra】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31182    Accepted Submission(s): 13456 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

HDOJ 1142 A Walk Through the Forest 【Dijkstra】+【DFS】

题意:从2到1的所有路径中找出最短的路,并且输出最短路径有几条. 策略:先求出最短路径,然后再找出从2到1的最短路径有几条.最短路径用dijkstra算法来求出,什么是dijkstra算法,简单来说,dijkstra算法就是路径长度递增次序产生最短路径的算法: 基本思想是:把集合V分成两组: (1)S:已求出最短路径的顶点的集合 (2)V-S=T:尚未确定最短路径的顶点集合 将T中顶点按最短路径递增的次序加入到S中, 保证:(1)从源点V0到S中各顶点的最短路径长度都不大于 从V0到T中任何顶点

HDOJ 1874 畅通工程续 【dijkstra】

题意:... 策略:最简单的求最短路径. 代码: #include<stdio.h> #include<string.h> #define MAXN 1005 #define INF 0x3f3f3f3f int di[MAXN], vis[MAXN], n, m; int map[MAXN][MAXN]; void dijkstra(int v) { int i, j; memset(vis, 0, sizeof(vis)); di[v] = 0; vis[v] = 1; for

HDU3790 最短路径问题 【Dijkstra】

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13336    Accepted Submission(s): 4072 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

HDU2112 HDU Today 【Dijkstra】

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14743    Accepted Submission(s): 3471 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

ZOJ--1655--Transport Goods【dijkstra】

题意:某国首都正被攻打,需要运送物资到首都,告诉你n个点,编号1~n,n是首都,剩下的点各有wi重量的物资,m条路,每条路有个货物损失比例,现需要求出最多能运送多少货物到首都. 其实转换一下就是一个最短路问题,边的权值是损失比例,找损失比例最小的那条路,则能运送的货物最多. dist数组存放运成功的比例,初始化为0表示运不成. WA了N发,各种double类型都用int定义的,而且它给的样例即使定义成int对结果也没影响... #include<cstring> #include<str