首页 > 其他 > 详细

1013 Battle Over Cities (25分)

时间:2020-03-14 09:54:04      阅读:89      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 这个题。用dfs来计算,去除特定节点后的连通分量个数。我本来想,去除某节点,要把节点删掉,且把对应边全删掉,这样改动太大了,很麻烦,而且每次还得复原,看了别人的做法,其实每次把那个特定节点记为被访问过就好。这个题用cin,cout绝对超时,得用scanf,printf。其实dfs还是很简单的,不过邓书上的描述给我吓怕了,一直没想着总结,别人的dfs都很简单。其实是照着别人的代码和思路敲的,还是太菜了,由于建图的方式和别人不一样,照着别人的方式写dfs,没法得出答案,找bug找了好久,才把问题锁定在dfs里面,真的菜。11~13行,用我的建图方式应该是如代码所示用Edge[v][i]来访问邻居而不是直接i。我好菜啊,这题不难吧。哎,不断学习吧,今天也不是没有收获。dfs以后也能上手了。之前看邓书,邓老师喜欢把函数或者各种图封装在类里,我以前觉得实际敲代码不写在类里面(实际上可以),而是在main函数外写一个个函数,而我以前只会把变量声明定义在main函数里面,这就造成在main外定义的函数得传递好多个形参,返回值也不好弄,很麻烦,今天看别人的代码才突然意识到可以定义在全局变量里,这样就可以像类里面定义的函数一样形参比较少,也可以更改不在形参里面的参数。可能c++和c相比,c++的优势仅仅在于STL?类的作用不大。还遗留一个问题:

在全局变量里定义int N,在main函数里也可以定义int N,编译能通过,但是这两个N不是同一个东西,main函数里对N的赋值不能传递给全局变量N.有时间查查为什么.

 

 1 #include<iostream>
 2 #include<vector>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 int visited[1001]; 
 7 vector<vector<int> > Edge(1001);
 8 void DFS(int v)
 9 {
10      visited[v]=1;
11      for(int i=0;i<Edge[v].size();i++)
12       if(visited[Edge[v][i]]==0)
13         DFS(Edge[v][i]);
14 
15 }    
16 int main(){ 
17      int node[1001];
18      int N,M,K,C1,C2;
19      scanf("%d%d%d",&N,&M,&K);
20      for(int i=0;i<M;i++)
21      {
22       scanf("%d%d",&C1,&C2);
23       Edge[C1].push_back(C2);
24       Edge[C2].push_back(C1);
25      }
26      int num,count=0;
27       for(int i=0;i<K;i++)
28       {
29         scanf("%d",&num);
30         visited[num]=1;
31         for(int j=1;j<=N;j++)
32        {
33           if(visited[j]==0)
34            { DFS(j);
35              count++;
36             } 
37           }
38         printf("%d\n",count-1);
39         count=0;
40         fill(visited,visited+1001,0);
41 }
42 
43 
44 return 0;
45 }

参考代码:https://www.liuchuo.net/archives/2346

 

1013 Battle Over Cities (25分)

原文:https://www.cnblogs.com/wsshub/p/12490206.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!