SPOJ 1435. Vertex Cover

来源:互联网 发布:下软件赚钱的软件ios 编辑:程序博客网 时间:2024/06/07 07:28

      题目链接:    http://www.spoj.com/problems/PT07X/

     这个题可以用贪心的思路做,a结点与b结点相关联,若a结点的度数为1,则一定是删除b结点比较好,这样找到所有度数为1的结点,删除与它相关联的结点,知道没有度数为1的结点。

#include<cstdio>#include<cstring>#include<iostream>#include<vector>#include<queue>#define MAXN 100010using namespace std;vector<int>edge[MAXN];queue<int>q;int  node[MAXN],vis[MAXN];int main(){    //freopen("in.txt","r",stdin);    int a,b,n,nn,ans;    scanf("%d",&n);    nn=n-1;    memset(node,0,sizeof(node));    memset(vis,0,sizeof(vis));    while(nn--)    {        scanf("%d%d",&a,&b);        edge[a].push_back(b);        edge[b].push_back(a);        node[a]++;        node[b]++;    }    for(int i=1; i<=n; i++)        if(node[i]==1)            q.push(i);    ans=0;    while(!q.empty())    {        int u=q.front();        q.pop();        if(vis[u])            continue;        for(int i=0; i<edge[u].size(); i++)        {            int v=edge[u][i];            if(!vis[v])            {                vis[v]=1;                ans++;                for(int j=0; j<edge[v].size(); j++)                {                    int t=edge[v][j];                    node[t]--;                    if(node[t]==1&&!vis[t])                        q.push(t);                }            }        }    }    cout<<ans<<endl;    return 0;}


原创粉丝点击