分糖果

发布时间 2023-07-26 09:49:20作者: 五星级神机

9692: 分糖果

分析:本题核心是求从某点出发到所有其它点的最短路径的最大值。相邻节点间的传送时间都是1秒,也就是图中所有边长都是1.所有可以用bfs解决。

图的存储:

我们选用邻接表,用vector数组来实现。

vector<int>G[maxN];

G是一维数组,数组元素的数据类型是vector。

G[i] 中存放i为起点的所有边的终点组成的向量。

给向量添加值的语法是:“向量名.push_back(值)”,

譬如:

  添加一条边1-->2  可以写成 G[1].push_back(2);

    添加一条边 2-->1  可以写成 G[2].push_back(1);

  由于这是个无向图,所以读入的两个点u,v ,都可以是起点或终点,

所以要建方向相反的两条边:

   G[u].push_back(v);

   G[v].push_back(u);

样例图在G中的数据为

 

const int maxN=1010;
vector<int>G[maxN];   
cin>>n>>p;
 for(int i=1;i<=p;i++)
     {
         int u,v; cin>>u>>v;     
         G[u].push_back(v);
         G[v].push_back(u);
     }

若想遍历h为起点的边,只要遍历向量G[v]就可以了。

1  for(int i=0;i<G[h].size();i++){
2             int v=G[h][i];
3             cout<<h<<"  "<<v<<endl;
4        }

完整代码:

 1  
 2 # include <bits/stdc++.h>
 3 using namespace std;
 4 const int maxN=1010;
 5 vector<int>G[maxN];
 6   
 7 int d[maxN];//d[i]表示搜索起点到i的距离。 
 8 int n,p,c,m;
 9  
10 bool flag,visited[maxN];
11   
12 void bfs(int s){
13     queue<int> Q;
14     Q.push(s);d[s]=0;
15     while (!Q.empty()){
16         int h=Q.front();Q.pop();
17         visited[h]=true;
18          
19         for(int i=0;i<G[h].size();i++){
20             int v=G[h][i];
21             if(!visited[v]){
22                  visited[v]=true; 
23                  d[v]=d[h]+1;
24                  Q.push(v);
25             }
26         }
27     }
28 }
29   
30 int main(){
31      cin>>n>>p>>c;
32      cin>>m;
33  
34      for(int i=1;i<=p;i++)
35      {
36          int u,v; cin>>u>>v;     
37          G[u].push_back(v);
38          G[v].push_back(u);
39      }
40           
41      bfs(c);
42      int maxL=d[1];
43      for(int i=2;i<=n;i++) maxL=max(maxL,d[i]); 
44      cout<<maxL+1+m<<endl;
45              
46     return 0;
47 }