예제 #1
0
파일: p.c 프로젝트: DavidToca/acm
static int solve()
{
	int i, j, k, t;

	for (i = 0; i < n; i++)
		bfs1[i] = bfs2(i, i);

	for (i = 1, k = bfs1[0]; i < n; i++)
		if (bfs1[i] < k) k = bfs1[i];

	if (k <= 3 || (k & 1))
		return k;

	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			if (i == j || adj[i][j] == 0)
				continue;

			t = bfs2(i, j);
			if (t < k)
				k = t;

			if (k & 1)
				return k;
		}
	}

	return k;
}
예제 #2
0
int main() {
//    freopen("input.txt", "r", stdin);
    char temp[20];
    gets(temp);
    int flag = 0;
    for (int i = 0; temp[i]; i++) {
        if (temp[i] == ' ') {
            flag = 1;
        }
    }
    if (!flag) {
        sscanf(temp, "%d", &point_number);
        memset(vis, 0, sizeof(vis));
        memset(maps, 0, sizeof(maps));
        for (int i = 1; i <= point_number; i++) {
            int x, y;
            scanf("%d%d", &x, &y);
            if (i == 1) {
                left_x = x;
                left_y = y;
            }
            maps[x][y] = 1;
        }
        printf("%d %d\n", left_x, left_y);
        bfs();
    }
    else {
        sscanf(temp, "%d %d", &left_x, &left_y);
        point_number = 1;
        memset(maps, 0, sizeof(maps));
        maps[left_x][left_y] = 1;
        bfs2();
        int ans = 0;
        for (int i = 1; i <= 10; i++) {
            for (int j = 1; j <= 10; j++) {
                if (maps[i][j]) {
                    ans++;
                }
            }
        }
        printf("%d\n", ans);
        for (int i = 1; i <= 10; i++) {
            for (int j = 1; j <= 10; j++) {
                if (maps[i][j]) {
                    printf("%d %d\n", i, j);
                }
            }
        }
    }
    return 0;
}
예제 #3
0
std::vector<Territory*> bfs2(Territory* start, Territory* end, std::vector<Territory*> discovered, std::vector<Territory*> previous, std::vector<Territory*> visited){
    std::vector<Territory*>::iterator i, j;
    visited.push_back(start);
    if(start == end){
        //izlaz iz rekurzije

        std::vector<Territory*> path;
        path.push_back(start);
        Territory* cilj = start;
        while(1){
            if(cilj==*(discovered.begin()))
                return path;
            for(i=discovered.begin(), j=previous.begin(); *i!=cilj; i++, j++);
            path.push_back(*j);
            cilj = *j;
        }
    }
    std::vector<Territory*> tmp = start->neighbours();


    //DODAVANJE NOVIH PRONADJENIH CVOROVA (od istog owner-a)
    for(i=tmp.begin(); i!=tmp.end(); i++){
        if(!contains(*i, discovered) && (start->owner() == (*i)->owner()) ){
            discovered.push_back(*i);
            previous.push_back(start);
        }
    }

    //TRAZENJE PRVOG PRONADJENOG CVORA KOJI JOS NIJE POSECEN
    //cout << "Looking for new vertex " << endl;
    for(i=discovered.begin(); i!=discovered.end(); i++){
        if(!contains(*i, visited) && (start->owner() == (*i)->owner()) ){
            break;
        }
    }

    if(i!=discovered.end()){
        return bfs2(*i, end, discovered, previous, visited);
    }

    //Cisto zbog warning
    std::vector<Territory*> war;
    return war;

}
void solve()
{
    int i,f;
    id=0;
    for(i=1;i<=n;i++)
    {
        for(f=1;f<=m;f++)
        {
            if(0 == map[i][f] && '1' == ch[i][f])
            {
                ++id;
                bfs(id,i,f);
            }
        }
    }    
    for(i=1;i<=n;i++)
    {
        for(f=1;f<=m;f++)
        {
            if(0 == map[i][f] && '0' == ch[i][f])
            {
                now=-1;
                flag=0;
                bfs2(i,f);
                if(2 == flag)
                {
                    continue;
                }
                idc[now]++;
            }
        }
    }    
    for(i=1;i<=id;i++)
    {
        idc[i]=zimu[idc[i]];
    }
}