hdu5438 连通子图

来源:互联网 发布:网络发展新技术 编辑:程序博客网 时间:2024/05/21 06:11

题目大意:将只有一个管道与其他池塘相连的池塘都去掉,最后剩下的n个联通图中,找有奇数个池塘的连通图中所有池塘的val值和。


思路:将所有单管道池塘去掉 , 然后搜索每一个连通图即可。


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <bitset>using namespace std;#define MAXN 10005#define LL long longint n , m;int arr[MAXN];int visit[MAXN];vector <int>V[MAXN];int solve(){    int temp = 0;    int num = 0;    for(int i = 1 ; i <= n ; i ++)    {        if(V[i].size() == 1)        {            temp = V[i][0];            std::vector<int>::iterator iter=std::find(V[temp].begin(),V[temp].end(),i);            V[temp].erase(iter);            num ++ ;            V[i].clear();        }    }    if(num) return 1;    else return 0;}int main(){    int t ;    scanf("%d" , &t);    while(t--)    {        scanf("%d %d" , &n , &m);       // memset(arr , 0 , sizeof(arr));       memset(visit, 0 , sizeof(visit));        for(int i = 1 ; i <= MAXN ; i ++ ) V[i].clear();        for(int i = 1 ; i <= n ; i ++)        {            scanf("%d" , &arr[i]);        }        int a , b;        for(int i = 0 ; i < m ; i ++)        {            scanf("%d %d" , &a, &b);            V[a].push_back(b);            V[b].push_back(a);        }        while(solve()) continue;        long long sum = 0;        for(int i = 1 ; i <= n ; i ++)        {            int temp = V[i].size();            long long s = 0;            int num = 0;            if(temp && !visit[i])            {                queue <int> Q;                Q.push(i);                num ++ ;                s += arr[i];                visit[i] = 1;                while(!Q.empty())                {                    int t = Q.front();                    Q.pop();                    int t_num = V[t].size();                    for(int j = 0 ; j < t_num ; j ++)                    {                        if(!visit[V[t][j]])                        {                            num ++ ;                            visit[V[t][j]] = 1;                            Q.push(V[t][j]);                            s += arr[V[t][j]];                        }                    }                }            }            if(num % 2) sum += s;        }        printf("%lld\n" , sum);    }    return 0;}


0 0
原创粉丝点击