Codeforces 954D Fight Against Traffic(BFS 最短路)

Posted doggod

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 954D Fight Against Traffic(BFS 最短路)相关的知识,希望对你有一定的参考价值。

题目链接:Fight Against Traffic

题意:有n个点个m条双向边,现在给出两个点S和T并要增加一条边,问增加一条边且S和T之间距离不变短的情况有几种?

题解:首先dfs求一下S到其他点和T到其他点的最短路(好久不写有点手生@。@),然后遍历所有的建边的情况,假设在i和j两个点之间建边则要满足 ds[i] + 1 + dt[j] > ds[T] && ds[j] + 1 + dt[i] > ds[T]。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 1e3+9;
 4 const int INF = 1e9+9;
 5 int N,M,S,T;
 6 vector<int> dir[MAX_N];
 7 int vec1[MAX_N],vec2[MAX_N];
 8 void bfs(int pos , int* vec){
 9     fill(vec,vec+MAX_N,INF);
10     queue<int> que;
11     que.push(pos);
12     vec[pos] = 0;
13     while(!que.empty()){
14         int t = que.front();
15         que.pop();
16         for(int i=0;i<dir[t].size();i++){
17             int x = dir[t][i];
18             if(vec[x] > vec[t] + 1){
19                 vec[x] = vec[t] + 1;
20                 que.push(x);
21             }
22         }
23     }
24     //for(int i=1;i<5;i++)cout<<"!!"<<vec[i]<<endl;
25 }
26 int main(){
27     while(cin>>N>>M>>S>>T){
28        for(int i=0;i<MAX_N;i++){
29             dir[i].clear();
30        }
31        for(int i=0;i<M;i++){
32            int a,b;
33            scanf("%d%d",&a,&b);
34            dir[a].push_back(b);
35            dir[b].push_back(a);
36        }
37        bfs(S,vec1);
38        bfs(T,vec2);
39        int ans =0 ;
40        int dis = vec1[T];
41        for(int i=1;i<=N;i++){
42             for(int j=i+1;j<=N;j++){
43                 if(vec1[i] + vec2[j] + 1 >= dis && vec1[j] + vec2[i] + 1 >= dis){
44                    ans ++;
45                 }
46             }
47         }
48         cout<<ans-M<<endl;
49     }
50     return 0;
51 }

 

以上是关于Codeforces 954D Fight Against Traffic(BFS 最短路)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 954 D Fight Against Traffic

Codeforces #617 (Div. 3) D. Fight with Monsters(贪心,排序)

Codeforces Round #617 (Div. 3) D. Fight with Monsters

Codeforces - 102222H - Fight Against Monsters - 贪心

Codeforces 1296D - Fight with Monsters

java http://code-fight.club/fight/43/ternary-operator-vs-if-else-when-initialize-