1013. Battle Over Cities (25)(DFS遍历)

 

For example, if we have 3 cities and 2 highways connecting city1-city2 and city1-city3. Then if city1 is occupied by the enemy, we must have 1 highway repaired, that is the highway city2-city3.

Input

Each input file contains one test case. Each case starts with a line containing 3 numbers N (<1000), M and K, which are the total number of cities, the number of remaining highways, and the number of cities to be checked, respectively. Then M lines follow, each describes a highway by 2 integers, which are the numbers of the cities the highway connects. The cities are numbered from 1 to N. Finally there is a line containing K numbers, which represent the cities we concern.

Output

For each of the K cities, output in a line the number of highways need to be repaired if that city is lost.

Sample Input

3 2 3
1 2
1 3
1 2 3

Sample Output

1
0
0
题目大意:给出n个城市之间有相互连接的m条道路,当删除一个城市和其连接的道路的时候,
问其他几个剩余的城市至少要添加多少个路线才能让它们重新变为连通图,其实就是求连通分支数
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 
 5 int graph[1001][1001];
 6 int visited[1001];
 7 int n,m,k;
 8 void dfs( int a)
 9 {
10     int i;
11     visited[a]=1;
12     for( i=1; i<=n; i++)
13     {
14         if( visited[i]==0 && graph[a][i]==1)
15             dfs(i);
16     }
17 }
18 int main()
19 {
20     int cnt=0,temp;
21     int i,j;
22     int a,b;
23     scanf("%d%d%d",&n,&m,&k);
24     for( i=0; i<m; i++)  //创建图
25     {
26         scanf("%d%d",&a,&b);
27         graph[a][b]=graph[b][a]=1;
28     }
29     for( i=0; i<k ; i++)
30     {
31         cnt=0;
32         memset( visited,0,sizeof(visited));  //每次都将visited全置0
33         scanf("%d",&temp);
34         visited[temp]=1;
35         for( j=1; j<=n; j++)
36         {
37             if( visited[j]==0)
38             {
39                 dfs(j);
40                 cnt++;  //连通分支数
41             }
42         }
43         printf("%d\n",cnt-1);  //需要建的高速为连通分支数减1 
44     }
45     return 0;
46 }

 


posted @ 2018-03-13 08:56  yuxiaoba  阅读(181)  评论(0编辑  收藏  举报