Saturday, June 11, 2016

UVa 10608 - Friends

#include <bits/stdc++.h>
#define LL  long long
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define pri(a) cout << a << endl;
#define prii(a,b) cout << a << " " << b << endl;
using namespace std;

// maximum nodes in a connected subgraph

vector<int>adj[30007];
int vis[30007];
int cnt;

void dfs(int u)
{
    vis[u]=1;
    cnt++;
    REP(i,SZ(adj[u]))
    {
        if(vis[adj[u][i]]==0) dfs(adj[u][i]);
    }
}

int main()
{
    int T, n, m, u, v;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        FOR(i,1,m)
        {
            cin>>u>>v;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
        int mx=0;
        memset(vis, 0, sizeof vis);
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                cnt=0;
                dfs(i);
                mx=max(mx, cnt);
            }
        }
        pri(mx);

       FOR(i,1,n) adj[i].clear();
    }
    return 0;
}



// disjoint sets solution .. gotta take care of the pair counting -_-

#include <bits/stdc++.h>
#define LL  long long
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define pri(a) cout << a << endl;
#define prii(a,b) cout << a << " " << b << endl;
using namespace std;

int par[30000];

void init(int node)
{
    REP(i,node) par[i] = i;
}

int find(int r)
{
    return par[r]==r ? r : par[r] = find(par[r]);
}

void make_union(int a,int b)
{
    int u=find(a), v=find(b);

    if(u != v)
        par[u]=v;
}

int main()
{
    int T,node,edge,u,v;

    cin>>T;

    while(T--)
    {
        cin>>node>>edge;

        init(node);

        REP(i,edge)
        {
            cin>>u>>v;
            make_union(u,v);
        }

        REP(i,node) find(i);

        REP(i,node) prii(i,par[i]);

        int cnt,mx = -1;

        REP(i,node)
        {
            cnt = 1;   //*********
            FOR(j,i+1,node-1)
            {
                if(par[i] == par[j]) cnt++;      //*********
            }
            mx = max(mx,cnt);
        }

        pri(mx);
    }
    return 0;
}

No comments:

Post a Comment