BZOJ1574 USACO 2009 Jan Gold 1.Earthquake Damage Solution

来源:互联网 发布:java linktag.class 编辑:程序博客网 时间:2024/05/22 00:37

要想被截掉的点越少,最优方案就是不可行点周围的点都损坏。然后bfs一下求出从1能到达的点,剩下的就是不能的了。

一定要注意:这是图,不是树!有可能有自环,有重边。

#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;struct node{int to,next;}edge[200050];int num;int head[200050];void add(int f,int t){edge[num].to=t;edge[num].next=head[f];head[f]=num++;}int n,m,k;int damage[200050];int vis[200050];int ans;void bfs2(){queue<int>Q;Q.push(1);if(damage[1]==1){ans=0;return ;}else{ans=1;vis[1]=1;}while(!Q.empty()){int u=Q.front();Q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v!=u&&vis[v]==0&&damage[v]==0){vis[v]=1;ans++;Q.push(v);}}}}int main(){scanf("%d %d %d",&n,&m,&k);memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);add(a,b);add(b,a);}for(int i=1;i<=k;i++){int x;scanf("%d",&x);for(int j=head[x];j!=-1;j=edge[j].next){damage[edge[j].to]=1;}}bfs2();printf("%d",n-ans);}


0 0
原创粉丝点击