PKU 2040 [有向图 同构]

http://162.105.81.212/JudgeOnline/problem?id=2040  

题意给定两个有向图,找出其同构的对应点,并输出其对应的序列。。。

 

介于 该题的点数 <= 25 个 直接dfs搜索就可以解决问题,但是剪掉还是必要的;

1 , 对于在途中的出度 和 入读 都唯一的点,那么就可以直接的判断其对应关系,

2 , 对于当前点u, 他与 已经 确定对应关系的点 i 的关系 必须 和 正准备和u匹配的点 v 和 点dict1[i].match 的关系相等 ;

如果不相等 ,那么必须剪枝。。。。

条件:

    if(map1[u][i] != map2[v][dict1[i].match] ||map1[i][u] != map2[dict1[i].match][v])   

/* Name: Copyright: Author: Date: 07-01-02 00:35 Description: */ Problem: 2040 User: yuhailin Memory: 224K Time: 0MS Language: C++ Result: Accepted #include #include #include using namespace std ; #define clr(c) memset(c,0,sizeof(c)) struct Node { string word ; int match ; }; int m, n1, n2, in1[30], out1[30], in2[30], out2[30], map1[30][30], map2[30][30]; Node dict1[30], dict2[30] ; int find(Node *dict, string str, int n) { for(int i = 0; i < n; i ++) { if(dict[i].word == str) return i ; } return -1 ; } void Init() { string t1, t2 ; n1 = n2 = 0 ; int a,b ; clr(map1), clr(map2), clr(in1), clr(out1), clr(in2), clr(out2) ; for(int i=0; i < m; i++) { cin >> t1 >> t2 ; a = find(dict1, t1, n1) ; if(a == -1) { a = n1 ; dict1[n1].word = t1, dict1[n1++].match = -1 ; } b = find(dict1, t2, n1) ; if(b == -1) { b = n1 ; dict1[n1].word = t2, dict1[n1++].match = -1 ; } map1[a][b] = 1 ; in1[b]++, out1[a]++ ; } for(int i=0; i> t1 >> t2 ; a = find(dict2, t1, n2) ; if(a == -1) { a = n2 ; dict2[n2].word = t1, dict2[n2++].match = -1 ; } b = find(dict2, t2, n2) ; if(b == -1) { b = n2 ; dict2[n2].word = t2, dict2[n2++].match = -1 ; } map2[a][b] = 1 ; in2[b]++, out2[a]++ ; } } void Attend_uniqe() { int ret, k; for(int i = 0 ; i < n1 ; i++) { ret = 0; for(int j=0;j> m && m) { Init() ; Attend_uniqe() ; df_search(n1 - 1) ; print() ; } return 0; }

     

你可能感兴趣的:(n2,search,string,struct,date,user)