Page 4 of 5

Posted: Fri Dec 22, 2006 6:46 am
by helloneo
yiuyuho wrote: Doesn't that mean the components of the given graphs are all bipartite? But the test case 3 does not satisfy that...
That case, we cannot invite anyone from that component..
So, the answer is 0.. :-)

Posted: Fri Dec 22, 2006 8:10 am
by yiuyuho
Well, what I am saying is the problem doesn't say what it means very nicely.
The given graph (Case 3) doesn't satisfy anti-transitive, it's something we have to check (not a property of the given graph)... But at the same time the symmetric relation is given in the same format and that's a property of the given graph...

You know what I mean? :-P

Posted: Fri Jul 06, 2007 6:52 pm
by Young20
I'm trying to solve this problem.
I passed all above test case. HOWEVER I still got Wrong Answer..
I really don't know why.. so I wonder there are some tricky input test case..
Anyway, would someone give me correct output regarding input below?
Input..

Code: Select all

2

10
3 2 3 4
1 6
0
1 5
0
1 9
3 8 9 10
0
1 3
0

20
3 2 3 4
0
0
0
Output

Code: Select all

0
19
Thanks

Posted: Fri Jul 06, 2007 6:57 pm
by helloneo
My AC code gives the same output..

Posted: Fri Jul 06, 2007 8:41 pm
by Young20
Hmm..
I almost exhausted.. I have no idea why I got WA..
Could somebody give me a little hint?

My code below and my algorithm like that.
1. build bipartite graph(like tree structure)
2. if there need to combine each other trees, make one tree.
3. print out maximum number of invitation.

Code: Select all

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string>
#include <strstream>
using namespace std;

#define MAXN	220
typedef struct {
	int NrFriend, NrEnermy, illegal;
} Group;

int bipartite[MAXN][2];
int depth[MAXN];
Group g[MAXN];
int N;

int set_enermy(int x, int y)
{
	int a,b,r1,r2;

	for (a = x, r1 = 0; bipartite[a][0] != -1; r1 += bipartite[a][1], a = bipartite[a][0]);
	for(b = y, r2 = 0; bipartite[b][0] != -1; r2 += bipartite[b][1], b = bipartite[b][0]);

	if (a==b && (r1+r2)%2 != 1) {
		g[a].illegal = 1;
		return 0;
	}

	if (a != b) {
		if (depth[a] < depth[b]) {
			bipartite[a][0] = b;
			bipartite[a][1] = (r1+r2+1)%2;
			if (bipartite[a][1] % 2 == bipartite[b][1] % 2) {
				g[b].NrEnermy += g[a].NrEnermy;
				g[b].NrFriend += g[a].NrFriend;
			} else {
				g[b].NrEnermy += g[a].NrFriend;
				g[b].NrFriend += g[a].NrEnermy;
			}
		} else {
			bipartite[b][0] = a;
			bipartite[b][1] = (r1+r2+1)%2;
			if (bipartite[a][1] % 2 == bipartite[b][1] % 2) {
				g[a].NrEnermy += g[b].NrEnermy;
				g[a].NrFriend += g[b].NrFriend;
			} else {
				g[a].NrEnermy += g[b].NrFriend;
				g[a].NrFriend += g[b].NrEnermy;
			}
			if (depth[a] == depth[b]) {
				depth[a]++;
			}
		}
	}

	return 0;
}

int main()
{
	int i,j,k,testcase,maxinvitation;
	char buffer[200];

	do {
		cin.getline(buffer,200);
	} while (buffer[0] == '\n' || buffer[0] == '\0');
	istrstream strin(buffer);
	strin >> testcase;
	while (testcase--) {
		do {
			cin.getline(buffer,200);
		} while (buffer[0] == '\n' || buffer[0] == '\0');
		istrstream strin1(buffer);
		strin1 >> N;

		for (i = 1; i <= 200; i++) {
			bipartite[i][0] = -1;
			bipartite[i][1] = 0;
			depth[i] = 0;
			g[i].NrEnermy = 0;
			g[i].NrFriend = 1;
			g[i].illegal = 0;
		}

		i = 1;
		do {
			cin.getline(buffer, 200);
			if (buffer[0] == '\n' || buffer[0] == '\0') break;
			
			istrstream strin2(buffer);
			strin2 >> k;

			while (k-- > 0 && !strin2.eof()) {
				j = -1;
				strin2 >> j;
				if (i <= N && j != -1 && j <= N) {
					set_enermy(i,j);
				}
			}
		} while (i++);
		
		// printout
		maxinvitation = 0;
		for (i = 1; i<= N; i++) {
			if (bipartite[i][0] == -1 && g[i].illegal == 0) {
				maxinvitation += (g[i].NrEnermy > g[i].NrFriend)? g[i].NrEnermy : g[i].NrFriend;
			}
		}
		cout << maxinvitation << endl;
	}
	return 0;
}

Thanks

Posted: Fri Jul 06, 2007 9:40 pm
by yiuyuho

Code: Select all

   char buffer[200];  
is clearly not enough, as the problem are of order 200.

Also, I am not sure what your setEnemy is doing, what's r1, r2?

Posted: Sat Jul 07, 2007 2:41 am
by Young20
Hello

first of all, it has type error. These two line should be changed like that

Code: Select all

	for (a = x, r1 = 0; bipartite[a][0] != -1; r1 +=bipartite[a][1], a = bipartite[a][0]);
	for (b = y, r2 = 0; bipartite[b][0] != -1; r2 +=bipartite[b][1], b = bipartite[b][0]);
But still got WA.. even though I extended the size of buffer rather than 200.

Code: Select all

char buffer[1000];
setEnermy function is doing like that
if x, y is enermy, a became root of b with relation value(bipartite[1])-that is combining two diffrent graph.
As you can see, a and b is root of x and y. And you can collect r1, r2 that climb up to parent node.
if bipartite[1] is 0 that means b has same color with its parent. if bipartite[1] has 1, b has diffrent color with its parent.

Please help me out..

Thanks

Posted: Sat Jul 07, 2007 4:23 pm
by Young20
Hmm..
How about this input..
It makes me crazy.

Code: Select all

1

100
2 23
0
0
3 3 8 11
3 8 11 13
1 11
1 13
2 4 5
2 18 13
3 20 18 21
3 4 5 6 
1 21
0
0
0
0
1 21
2 9 10
1 21
0
4 12 17 19 25
0
0
2 25 27
4 21 22 23 24
0
2 24 26
0
3 30 37 38
3 26 28 29
0
0
0
0
0
0
1 29
2 29 31
1 40
3 31 39 51
0
0
0
0
0
0
0
0
0
0
0
0
2 58 59
0
0
1 79
2 51 52
2 53 52
1 53
0
0
0
0
0
0
0
0
0
0
0
1 53
0
1 79
0
1 53
0
0
0
1 53 54 55 56 70 72 73
0
0
0
0
3 73 74 76
0
3 76 77 83
2 90 100
1 83
0
3 83 85 87
0
0
0
0
0
0
0
0
0
2 87 89

my output like that

Code: Select all

73
Am I right?

Posted: Sat Jul 07, 2007 9:17 pm
by yiuyuho
So, how does bipartite[x][1] help you with the calculation?

Posted: Fri Aug 03, 2007 10:44 am
by shakil
Why WA!!!!!! I check all sample input and output in the post but can not find the cause of WA. Please help......

Code: Select all

#include<stdio.h>
long n,sa[209][209],x[209],y[209],z[209],si[209];
void make(long h1,long h2)
{
	long X,Y,i;
X=0;
Y=0;

for(i=1;i<=n;i++)
{if(sa[h2][i]==1&&si[i]==1)
X=1;
else if(sa[h2][i]==1&&si[i]==2)
Y=1;}
if(X==1&&Y==1)
{z[h1]=1;si[h2]=1;}
else if(X==1)
{y[h1]++;si[h2]=2;}
else
{x[h1]++;si[h2]=1;}

for(i=1;i<=n;i++)
if(sa[h2][i]==1&&si[i]==0)
make(h1,i);

}

void main()
{

long cas,cas1,m,i,j,sum,a,b;

scanf("%ld",&cas);

for(cas1=1;cas1<=cas;cas1++)
{

scanf("%ld",&n);

for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
sa[i][j]=0;

for(i=1;i<=n;i++)
si[i]=0;

for(i=1;i<=n;i++)
{
scanf("%ld",&a);
for(j=0;j<a;j++)
{
scanf("%ld",&b);
if(b<=n)
{
sa[i][b]=1;
sa[b][i]=1;
}
}
}

m=0;
for(i=1;i<=n;i++)
if(si[i]==0)
{
x[m]=1;
y[m]=0;
z[m]=0;
si[i]=1;
for(j=1;j<=n;j++)
if(sa[i][j]==1&&si[j]==0)
make(m,j);
m++;
}

for(i=0;i<m;i++)
if(y[i]>x[i])
x[i]=y[i];
sum=0;

for(i=0;i<m;i++)
if(z[i]==0)
sum+=x[i];

printf("%ld\n",sum);

}
}

Re: 10505 - Montesco vs Capuleto

Posted: Sat Dec 24, 2011 1:55 am
by withelm
Yo,
I check all in/out but I do not know why is WA

Code: Select all

#include <cstdio>
#include <vector>

using namespace std;

const int MX = 300;

bool v[MX];
vector <int> gr[MX];
int kolor[MX];

int n,m,a,b,c,wynik;

void clear()
{
    for(int i=0;i<MX;i++)
    {
        v[i] = false;
        gr[i].clear();
        kolor[i] = 3;
    }
    wynik = 0;
}

int bfs(int x)
{
    vector <int> kolejka;
    kolejka.push_back(x);
    v[x] = true;
    kolor[x] = 1;
    int red = 0;
    int blue = 0;
    int next;
    bool ok = false;

    while(!kolejka.empty())
    {
        int u = kolejka.back();
        kolejka.pop_back();
        if(kolor[u]) ++red;
        else ++blue;
        next = (kolor[u]+1)&1;
        //printf("%d ",u);
        for(int j=0;j<gr[u].size();j++)
        {
            if(!v[gr[u][j]])
            {
                v[gr[u][j]] = true;
                kolor [ gr[u][j] ] = next;
                kolejka.push_back(gr[u][j]);
            }
            else
            if (kolor[u] == kolor[gr[u][j]])
                ok = true;
        }

    }
    if(ok) return 0;
    return max(red,blue);

}

int main()
{
    scanf("%d",&m);
    while(m--)
    {
        clear();
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a);
            while(a--)
            {
                scanf("%d",&b);
                gr[b].push_back(i);
                gr[i].push_back(b);
            }
        }
/*
        pisz();
*/
        for(int i=1;i<=n;i++)
            if(!v[i])
                wynik+=bfs(i);

        printf("%d\n",wynik);
        //if(m)puts("");
//       for(int i=1;i<=n;i++)
  //        printf("%d ",kolor[i]);
    //    puts("");

    }
}

Re: 10505 - Montesco vs Capuleto

Posted: Thu Jul 19, 2012 8:09 pm
by Scarecrow
AC

Code: Select all

AC

Re: 10505 - Montesco vs Capuleto

Posted: Tue Jul 24, 2012 2:40 pm
by Scarecrow
some input sets are like this. be sure to handle these

Code: Select all

1

5
5 2 4 6 8 10
3 1 3 6
0
0
3 1 6 7
output

Code: Select all

3

Re: 10505 - Montesco vs Capuleto

Posted: Sat Jan 19, 2013 7:23 pm
by mahade hasan
cutt>>>>>>>>>>>>>AC

Re: 10505 - Montesco vs Capuleto

Posted: Tue Jul 30, 2013 7:30 pm
by m.shawkey
my code works fine for all test cases posted here, but it gives wrong answer, can any one help me, please?

my code here http://ideone.com/hHaf3N