1#include <iostream>
 2using namespace std;
 3
 4#define max 100
 5
 6int matrix[max][max];    //关联矩阵
 7
 8int x,y;                //|V1|,|V2|
 9
10int check[max];         //确定下部图是否被访问
11int link[max];            //下部图连接上部图的点
12
13bool find(int up)
14{
15    int down;
16    for(down=0;down<y;down++)
17    {
18        if(matrix[up][down]==1&&check[down]==0)
19        {
20            check[down]=1;
21            if(link[down]==-1||find(link[down]))
22            {
23                link[down]=up;
24                return true;
25            }

26        }

27    }

28    return false;
29}

30
31int match()
32{
33    int up;
34    int num=0;
35    memset(link,-1,sizeof(link));
36    for(up=0;up<x;up++)
37    {
38        memset(check,0,sizeof(check));
39        if(find(up))
40            num++;
41    }

42    return num;
43}

44
45int main()
46{
47    int i,j;
48    int r;
49    cout<<"使用说明:"<<endl
50        <<"首先输入二部图上部和下部的节点个数;"<<endl
51        <<"然后输入关联矩阵,1表示匹配,0表示不匹配;"<<endl
52        <<"程序会给出最大匹配数和匹配路径"<<endl<<endl;
53    cout<<"依次输入|V1|,|V2|:"<<endl;
54    cin>>x>>y;
55    
56    cout<<"输入关联矩阵:"<<endl;
57    for(i=0;i<x;i++)
58        for(j=0;j<y;j++)
59            cin>>matrix[i][j];
60        r=match();
61        cout<<"最大匹配数: ";
62        cout<<r<<endl;
63        
64        cout<<"匹配路径:"<<endl;
65        for(i=0;i<y;i++)
66        {
67            if(link[i]!=-1)
68            cout<<"Y"<<i+1<<"-X"<<link[i]+1<<" ";
69        }

70        cout<<endl;
71        return 0;
72}
===================================================
  1#include <iostream>
  2#include <vector>
  3#include <string>
  4using namespace std;
  5
  6///////////////////////////////////////////////////////////////////
  7//                      节点类
  8class Node
  9{
 10public:
 11    Node * left;
 12    Node * right;
 13    double num;
 14    string source;
 15    string code;
 16
 17    Node();
 18    ~Node();
 19}
;
 20
 21Node::Node()
 22{
 23    left=NULL;
 24    right=NULL;
 25    num=0;
 26    source="";
 27    code="";
 28}

 29
 30Node::~Node(){}
 31
 32///////////////////////////////////////////////////////////////////
 33
 34//排序
 35void sort(vector<Node> &a)
 36{
 37    int i,j;
 38    for(i=0;i<a.size();i++)
 39        for(j=0;j<a.size()-i-1;j++)
 40        {
 41            if(a[j].num>a[j+1].num)
 42            swap(a[j],a[j+1]);
 43        }

 44}

 45
 46/////////////////////////////////////////////////////////////////////
 47//Huffman编码
 48void code(Node *root)
 49{
 50    if(root->left==NULL)
 51        return;
 52    else
 53    root->left->code=root->code+"0";
 54    if(root->right==NULL)
 55        return;
 56    else
 57    root->right->code=root->code+"1";
 58
 59    code(root->left);
 60    code(root->right);
 61
 62}

 63////////////////////////////////////////////////////////////////////////
 64//输出编码好的对象
 65void printCode(Node *root)
 66{
 67    Node *temp;
 68    temp=root;
 69    if(temp->left==NULL||temp->right==NULL)
 70    {
 71        cout<<temp->source<<" "<<temp->num<<" "<<temp->code<<endl;
 72        return;
 73    }

 74    printCode(temp->left);
 75    printCode(temp->right);
 76}

 77
 78/////////////////////////////////////////////////////////////////////////
 79//竖向打印树,看的时候横着看
 80void PrintTree(Node *bt,int nLayer)
 81{
 82    Node *temp;
 83    temp=bt;
 84    if(temp==NULL) return;
 85    PrintTree(temp->right, nLayer+4);
 86    for(int i=0;i<nLayer;i++)
 87        cout<<" ";
 88    cout<<temp->source<<" "<<temp->num<<" "<<temp->code<<endl;
 89    PrintTree(bt->left, nLayer+4);
 90}

 91///////////////////////////////////////////////////////////////////////////
 92int main()
 93{
 94    int size;
 95    int i;
 96    Node root;
 97    cout<<"输入需要编码的节点个数:"<<endl;
 98    cin>>size;
 99    vector<Node>a(size);
100    
101    cout<<"依次输入需要编码的字符和权值:"<<endl;
102    for(i=0;i<size;i++)
103    {
104        cout<<"#"<<i+1<<":"<<endl;
105        cin>>a[i].source>>a[i].num;
106    }

107    for(i=0;i<2*size-2;i=i+2)
108    {
109        Node temp;
110        sort(a);
111        temp.num=a[i].num+a[i+1].num;
112        temp.source=a[i].source+a[i+1].source;
113        a.push_back(temp);
114        a[a.size()-1].left=&a[i];
115        a[a.size()-1].right=&a[i+1];
116        root=a[a.size()-1];
117    }

118    code(&root);
119    
120    cout<<"Huffman树,从左到右依次是字符,权值,密码,看的时候横着看"<<endl<<endl;
121    cout<<"HuffmanTree:"<<endl;
122    PrintTree(&root,0);
123    cout<<endl;
124    cout<<"密码与对应的字符及权值:"<<endl;
125    printCode(&root);
126    return 0;
127}

128
129