最短路 Codeforces Round #103 (Div. 2) D. Missile Silos

题目传送门

 1 /*
 2     最短路: 不仅扫描边,还要扫描点;点有两种情况,一种刚好在中点,即从u,v都一样,那么最后/2
 3                 还有一种是从u,v不一样,两种的距离都是l
 4     模板错了,逗了好久:(
 5 */
 6 #include <cstdio>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <cmath>
10 #include <vector>
11 #include <queue>
12 using namespace std;
13
14 const int MAXN = 1e5 + 10;
15 const int INF = 0x3f3f3f3f;
16 int d[MAXN];
17 int cnt[MAXN];
18 bool vis[MAXN];
19 vector<pair<int, int> > G[MAXN];
20 int n, m, s, l, ans, ans2;
21
22 void SPFA(void) {
23     memset (vis, false, sizeof (vis));
24     memset (d, INF, sizeof (d));  d[s] = 0;
25     queue<int> Q;   Q.push (s);
26     while (!Q.empty ()) {
27         int u = Q.front (); Q.pop ();
28         vis[u] = false;
29         for (int i=0; i<G[u].size (); ++i)  {
30             int v = G[u][i].first;    int w = G[u][i].second;
31             if (d[v] > d[u] + w)    {
32                 d[v] = d[u] + w;
33                 if (!vis[v])    {
34                     vis[v] = true;  Q.push (v);
35                 }
36             }
37         }
38     }
39 }
40
41 int main(void)  {       //Codeforces Round #103 (Div. 2) D. Missile Silos
42     //freopen ("spfa.in", "r", stdin);
43
44     while (scanf ("%d%d%d", &n, &m, &s) == 3)   {
45         for (int i=1; i<=m; ++i)    {
46             int u, v, w;    scanf ("%d%d%d", &u, &v, &w);
47             G[u].push_back (make_pair (v, w)); G[v].push_back (make_pair (u, w));
48         }
49         scanf ("%d", &l);   SPFA ();
50
51         ans = ans2 = 0;
52         for (int i=1; i<=n; ++i)    {
53             for (int j=0; j<G[i].size (); ++j)  {
54                 int u = i, v = G[i][j].first, w = G[i][j].second;
55                 if (d[u] < l && l - d[u] < w)   {
56                     if (w - (l-d[u]) + d[v] > l)    ans++;
57                     else if (d[u] + d[v] + w == 2 * l)  ans2++;
58                 }
59             }
60             if (d[i] == l)  ans++;
61         }
62         printf ("%d\n", ans + ans2 / 2);
63     }
64
65     return 0;
66 }
时间: 2024-09-29 21:45:28

最短路 Codeforces Round #103 (Div. 2) D. Missile Silos的相关文章

Codeforces Round #257 div.2 D or 450D Jzzhu and Cities【最短路】

Codeforces Round #257 div.2 D or 450D Jzzhu and Cities[最短路] 题目链接:点击打开 题目大意: 在一个国家中有n个城市(城市编号1~n),m条公路和k条铁路,编号为1的城市为首都,为了节约,不需要的铁路需要关闭,问在保证首都到其余所有城市的最短路不变的条件下,最多有多少条铁路是不需要的. 解法: 这个题比较麻烦,保证首都到其余城市的最短路不变,要求出最多有多少条铁路是不需要的,那肯定是从最短路的代码上下手了,我们首先考虑dijkstra算法

Codeforces Round #536 (Div. 2) - D. Lunar New Year and a Wander(最短路)

Problem  Codeforces Round #536 (Div. 2) - D. Lunar New Year and a Wander Time Limit: 3000 mSec Problem Description Input Output Output a line containing the lexicographically smallest sequence a1,a2,…,an Bob can record. Sample Input 3 21 21 3 Sample

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces Round #257 (Div. 2)

A.Jzzhu and Children 计算每个人会出现的轮次数,取最后一个且轮次数最大的,注意是用a[i]-1 % m,倒着扫一遍就行了 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; const int maxn = 100+10; int n, m; int a[maxn]; int main() { #ifdef LOCAL freopen("

Codeforces Round #354 (Div. 2) ABCD

Codeforces Round #354 (Div. 2) Problems # Name     A Nicholas and Permutation standard input/output 1 s, 256 MB    x3384 B Pyramid of Glasses standard input/output 1 s, 256 MB    x1462 C Vasya and String standard input/output 1 s, 256 MB    x1393 D T

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

CodeForces 360E Levko and Game(Codeforces Round #210 (Div. 1))

题意:有一些无向边m条权值是给定的k条权值在[l,r]区间可以由你来定,一个点s1 出发一个从s2出发  问s1 出发的能不能先打到f 思路:最短路. 首先检测能不能赢 在更新的时候  如果对于一条边 a->b  如果dis1[a] <dis2[a]  那么选择这条边就选择   l  因为这条边对于s1有利 如果两个起点都选择了这条边  则说明s1 赢定了,所以要让他们尽量走这条,所以边权越小越好.跑完之后检测 如果  dis1[f]<dis2[f] 那么 就赢了. 接下来判断能不能平局

Codeforces Round 239 Div 1

都怪自己太懒了 这段时间比赛参加了大部分,但是一直都没写题解,趁这几天没事,计划把这段时间的题解都补上. 上一次比赛(248)终于升到了div1,所以从这次开始就开始写div1了. A. Triangle There is a right triangle with legs of length a and b. Your task is to determine whether it is possible to locate the triangle on the plane in such

Codeforces Round #258 (Div. 2)

A - Game With Sticks 题目的意思: n个水平条,m个竖直条,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉 解题思路: 每次删除交点所在的行和列,则剩下n-1行和m-1列,直到行或列被删完为止,最多删除的次数为min(n,m),删除min(n,m)后剩余的都是行或者列(注意行与行,列与列之间不可能有交点).只需要判断min(n,m)的奇偶性. #include <iostream> #include <vector&