题目描述
假设图用邻接矩阵存储。输入图的顶点信息和边信息,完成邻接矩阵的设置,并计算各顶点的入度、出度和度,并输出图中的孤立点(度为0的顶点)
输入
测试次数T,每组测试数据格式如下:
图类型 顶点数 (D—有向图,U—无向图)
顶点信息
边数
每行一条边(顶点1 顶点2)或弧(弧尾 弧头)信息
输出
每组测试数据输出如下信息(具体输出格式见样例):
图的邻接矩阵
按顶点信息输出各顶点的度(无向图)或各顶点的出度 入度 度(有向图)。孤立点的度信息不输出。
图的孤立点。若没有孤立点,不输出任何信息。
样例输入
2 D 5 V1 V2 V3 V4 V5 7 V1 V2 V1 V4 V2 V3 V3 V1 V3 V5 V4 V3 V4 V5 U 5 A B C D E 5 A B A C B D D C A D
样例输出
0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 V1: 2 1 3 V2: 1 1 2 V3: 2 2 4 V4: 2 1 3 V5: 0 2 2 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 A: 3 B: 2 C: 2 D: 3 E
#include <iostream>
#include <string>
using namespace std;
void output(char symbol,int **m,string *s,int n)
{
int sum=0;
if(symbol=='U')
{
for(int i=0;i<n;i++)
{
sum=0;
cout<<s[i];
for(int j=0;j<n;j++)
{
if(m[i][j]!=0)
sum++;
}
if(sum!=0)
cout<<':'<<' '<<sum;
cout<<endl;
}
}
else
{
int sum1;
for(int i=0;i<n;i++)
{
sum=0;
sum1=0;
cout<<s[i];
for(int j=0;j<n;j++)
{
if(m[i][j]!=0)
sum++;
}
for(int j=0;j<n;j++)
{
if(m[j][i]!=0)
sum1++;
}
if(sum==0&&sum1==0)
cout<<endl;
else
{
cout<<':'<<' '<<sum;
cout<<' '<<sum1<<' '<<sum+sum1;
cout<<endl;
}
}
}
}
void test()
{
char symbol;
cin>>symbol;
int n,k;
cin>>n;
string *s=new string[n];
for(int i=0;i<n;i++)
cin>>s[i];
int **m;
m=new int*[n];
for(int i=0;i<n;i++)
{
m[i]=new int[n];
for(int j=0;j<n;j++)
m[i][j]=0;
}
cin>>k;
string temp1,temp2;
int flag1,flag2;
for(int i=0;i<k;i++)
{
cin>>temp1>>temp2;
for(int p=0;p<n;p++)
{
if(s[p]==temp1)
flag1=p;
if(s[p]==temp2)
flag2=p;
}
m[flag1][flag2]=1;
if(symbol=='U')
m[flag2][flag1]=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j==n-1)
cout<<m[i][j];
else
cout<<m[i][j]<<' ';
}
cout<<endl;
}
output(symbol,m,s,n);
}
int main()
{
int t;
cin>>t;
while(t--)
test();
}