zoukankan      html  css  js  c++  java
  • POJ3697

    /*
        Memory  Time
        7096K    2641MS
    */
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    #define HASHLEN 1000117
    #define DEMNUM  1000001
    
    int hashTable[HASHLEN];
    int factor = 10091;
    
    int pcs[10001];
    
    struct Node {
        int a;
        int b;
        int next;
    };
    Node dam_node[DEMNUM];
    
    int myq[DEMNUM];
    
    inline int is_demaged(int a, int b) {
    
        int idx = hashTable[(a * factor + b) % HASHLEN];
        while (idx > 0) {
            if (dam_node[idx].a == a && dam_node[idx].b == b) {
                return 1;
            }
            idx = dam_node[idx].next;
        }
        return 0;
    }
    
    int main() {
        int case_i = 0;
        int pc_num = 0, dam_num = 0, i, j, num, pca, pcb, head, tail, hVal, idx, flag;
        while(scanf("%d %d", &pc_num, &dam_num) && !(pc_num == 0 && dam_num == 0)) {
    
            memset(hashTable, 0x00, sizeof(hashTable));
            memset(pcs, 0x00, sizeof(pcs));
            for (i = 1; i <= dam_num; i++) {
                //input data
                scanf("%d %d", &pca, &pcb);
                if (pca < pcb) {
                    dam_node[i].a = pca;
                    dam_node[i].b = pcb;
                    hVal = (pca * factor + pcb) % HASHLEN;
                } else {
                    dam_node[i].a = pcb;
                    dam_node[i].b = pca;
                    hVal = (pcb * factor + pca) % HASHLEN;
                }
                dam_node[i].next = 0;
    
                //create hash table
                idx = hashTable[hVal];
                if (idx > 0) {
                    dam_node[i].next = idx;
                    hashTable[hVal] = i;
                } else {
                    hashTable[hVal] = i;
                }
            }
     
            num = 0;
            head = 0;
            tail = 0;
            for (i = 2; i <= pc_num; i++) {
                if (!is_demaged(1,i)) {
                    myq[(tail++) % DEMNUM] = i;
                    num++;
                    pcs[i]=1;
                }
            }
            while(head!=tail) {
                int v = myq[(head++) % DEMNUM];
                for (j = 2; j <= pc_num; j++) {
                    if (pcs[j]==1 || v == j) continue;
                    if (v < j) {
                        flag = is_demaged(v,j);
                    } else {
                        flag = is_demaged(j,v);
                    }
                    if (!flag) {
                        pcs[j]=1;
                        myq[(tail++) % DEMNUM] = j;
                        num++;
                    }
                }
            }
            printf("Case %d: %d
    ", ++case_i, num);
        }
    }
  • 相关阅读:
    015_stdc_C语言
    014_stdc_C语言
    013_stdc_C语言
    012C语言
    011_stdc_C语言
    010_stdc_C语言
    009_stdc_C语言
    008_stdc_C语言
    40.委托
    39.多线程
  • 原文地址:https://www.cnblogs.com/hushpa/p/7170260.html
Copyright © 2011-2022 走看看