#include <iostream>
 
#include <fstream>
 
using namespace std;
 
const int Infinity=-1;
 
typedef char VexType;
 
struct VexCell//顶点的信息
 
{
 
        VexType data;//顶点数据
 
        bool visited;//是否被访问过
 
};
 
struct ArcCell//弧的信息
 
{
 
        int adj;     
 
};
 
const MVN=21;
 
struct MGraph
 
{
 
        VexCell vexs[MVN];//顶点数组
 
        ArcCell arcs[MVN][MVN];//邻接矩阵
 
        int kind,vexnum,arcnum;//类型,顶点数,弧数
 
};
 
int LocateVex(MGraph &G,VexType v);//查找顶点
 
bool InsertVex(MGraph &G,VexType u);//插入顶点
 
bool InsertArc(MGraph &G,VexType u,VexType v,int w=1);//插入弧
 
void CreateGraph(MGraph&G,char fn[]);//建立图
 
int  qiuru(MGraph&G,VexType &x);//顶点的入度
 
int  qiuchu(MGraph&G,VexType &x);//顶点的出度
 
void Show(MGraph &G);
 
int main()
 
{
 
        int count1=0;
 
        int count2=0;
 
        MGraph G;
 
        VexType fn[]="fn.txt";
 
        CreateGraph(G,fn);
 
        Show(G);VexType x='a';
 
        cout<<"顶点"<<x<<"的入度为:"<<qiuru(G,x)<<endl;
 
        cout<<"顶点"<<x<<"的出度为:"<<qiuchu(G,x)<<endl;
 
 
 
 
 
        return 0;
 
}
 
 
 
bool InsertVex(MGraph&G,VexType u)
 
{
 
        int i;
 
        if(G.vexnum+1>MVN)return false;
 
        i=LocateVex(G,u);
 
        if(i>0)return false;
 
        G.vexnum++;
 
        G.vexs[G.vexnum].data=u;
 
        for(i=1;i<=G.vexnum;i++)
 
                G.arcs[i][G.vexnum].adj=G.arcs[G.vexnum][i].adj=Infinity;
 
        return true;
 
}
 
bool InsertArc(MGraph&G,VexType u,VexType v,int w)
 
{
 
        int i,j;
 
        i=LocateVex(G,u);if(i==0)return false;
 
        j=LocateVex(G,v);
 
        if(j==0||j==i||G.arcs[i][j].adj!=Infinity)return false;
 
        G.arcs[i][j].adj=w;
 
        G.arcnum++;
 
        if(G.kind>=3)
 
        {
 
                G.arcs[j][i].adj=w;
 
            G.arcnum++;
 
        }
 
        return true;
 
}
 
int LocateVex(MGraph&G,VexType v)
 
{
 
        int i;
 
        for(i=G.vexnum;i>0&&G.vexs[i].data!=v;i--);
 
        return i;
 
}
 
void CreateGraph(MGraph&G,char fn[])
 
{
 
        int i,j,w;VexType u,v;ifstream f;
 
        f.open(fn);f>>G.kind;i=0;
 
        while(true)
 
        {
 
                f>>u;if(u=='#')break; i++;G.vexs[i].data=u;
 
        }
 
        G.vexnum=i;
 
        for(i=1;i<=G.vexnum;i++)
 
                for(j=1;j<=G.vexnum;j++) G.arcs[i][j].adj=Infinity;
 
        G.arcnum=0;
 
        while(true)//边
 
        {
 
                f>>u>>v;if(u=='#'||v=='#')break;
 
                if(G.kind==1||G.kind==3)
 
                        w=1;
 
                else f>>w;
 
                InsertArc(G,u,v,w);
 
        }
 
        f.close();
 
}
 
void Show(MGraph &G)
 
{
 
        int i=1,j=1;
 
        cout<<"所有顶点为:";
 
        for(i;i<=G.vexnum;i++)
 
                cout<<G.vexs[i].data<<" ";
 
        cout<<endl<<"所有弧为:";
 
        if(G.kind==1)
 
        {
 
                for(i=1;i<=G.vexnum;i++)
 
                        for(j=1;j<= G.vexnum;j++)
 
                                if(G.arcs[i][j].adj==1)
 
                                        cout<<"<"<<G.vexs[i].data<<","<<G.vexs[j].data<<"> ";
 
        }
 
        else
 
        {
 
                for(i=1;i<=G.vexnum;i++)
 
                        for(j=1;j<i;j++)
 
                                if(G.arcs[i][j].adj==1)
 
                                        cout<<"("<<G.vexs[i].data<<","<<G.vexs[j].data<<") ";
 
        }
 
        cout << endl;
 
}
 
int  qiuru(MGraph&G,VexType &x)
 
{
 
        int i,j;int count1=0;
 
        i=LocateVex(G,x);
 
        if(i==0)return -1;
 
        for(j=1;j<=G.vexnum;j++)
 
        {
 
                if(G.arcs[j][i].adj!=Infinity) count1++;
 
        }
 
        return count1;
 
}
 
int  qiuchu(MGraph&G,VexType &x)
 
{
 
        int i,j;int count2=0;
 
        i=LocateVex(G,x);
 
        if(i==0)return -1;
 
        for(j=1;j<=G.vexnum;j++)
 
        {
 
                if(G.arcs[i][j].adj!=Infinity) count2++;
 
        }
 
        return count2;
 
}
 
 
 
//fn.txt
 
1
 
a b c #
 
a b
 
b c
 
a c
 
# #