PAT_A_1013 Battle Over Cities

来源:互联网 发布:java实际问题汇总 编辑:程序博客网 时间:2024/05/18 06:15
//http://www.patest.cn/contests/pat-a-practise/1013
//题目的实际就是统计连通分量的个数
#include <iostream>#include <cstdio>#include <memory.h>using namespace std;int key[1001];int map[1001][1001];int map2[1001][1001];int vis[1001];int n,m,k,flag;void dfs(int s) {     int cur = s;     vis[cur] = 1;     for (int i = 1; i <= n; i++) {          if (map[cur][i] && !vis[i]) {               dfs(i);          }     }}int main() {    memset(key,0,sizeof(key));    memset(map,0,sizeof(map));    memset(map2,0,sizeof(map2));    memset(vis,0,sizeof(vis));    cin >> n >> m >> k;    for (int i = 0; i < m; i++) {          int a,b;          cin >> a >> b;          map[a][b] = 1;          map[b][a] = 1;    }    for (int i = 1; i <= k; i++) cin >> key[i];    for (int i = 1; i <= n; i++) { //保存地图          for (int j = 1; j <= n; j++)               map2[i][j] = map[i][j];    }    for (int t = 1; t <= k; t++) {          flag = key[t];          for (int i = 1; i <= n; i++) {//去掉已被占领城市的来路与去路               for (int j = 1; j <= n; j++) {                    if (i == flag || j == flag)                         map[i][j] = 0;               }          }          int cnt = 0;          for (int i = 1; i <= n; i++) { //此循环中每调用一次DFS 遍历图的一个连通分量          //每个顶点都作为起点 进行试探               if (!vis[i]) {                    dfs(i);                    cnt++; //统计连通分量总数               }          }          printf("%d\n",cnt-2);//要修的公路为除去key[i]外连通分量总数减1  则为 cnt - 1 - 1          for (int i = 1; i <= n; i++) { //恢复地图               for (int j = 1; j <= n; j++)                    map[i][j] = map2[i][j];          }          memset(vis,0,sizeof(vis));    }    return 0;}

0 0
原创粉丝点击