题意:http://acm.hdu.edu.cn/showproblem.php?pid=2463
原来是一个完全图,去掉一些边,问最后跟1相连的点有几个。
题解:
bfs+数据结构。感觉数据结构还是很神的。用vector存删去的边,用pre去判断和队列顶点相连的点。好神。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define maxn 10010
using namespace std;
int n,m,a,b;
int pre[maxn];
vector <int> map[maxn];
bool vis[maxn];
int solve(){
queue <int> q;
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
vis[1] = 1;
q.push(1);
int ans = 0;
while(!q.empty()){
int now = q.front();
q.pop();
for(int i = 0; i < map[now].size(); i ++)
pre[map[now][i]] = now;
for(int i = 1; i <= n;i ++)
if(!vis[i] && pre[i] != now)
vis[i] = true, q.push(i),ans ++;
}
return ans;
}
int main(){
int ca = 1;
while(~scanf("%d%d",&n,&m) && (n || m)){
for(int i = 1; i <= n; i ++)
map[i].clear();
for(int i = 0; i < m; i ++){
scanf("%d%d",&a,&b);
map[a].push_back(b);
map[b].push_back(a);
}
printf("Case %d: %d\n",ca ++ ,solve());
}
return 0;
}
本文通过BFS数据结构解决了一个关于完全图中删除部分边后,计算剩余图中与节点1相连点数量的问题。利用vector存储删除的边信息,并通过pre数组判断节点是否直接与队列顶点相连。
1025

被折叠的 条评论
为什么被折叠?



