鄰接矩陣存儲有向圖
【輸入描述】
輸入文件包含多組測試數據,每組測試數據描述了一個無權有向圖。每組測試數據第一行為兩個正整數n和m,1<=n<=100,1<=m<=500,分別表示了有向圖的頂點數目和邊的數目,頂點數從1開始計起。接下來有m行,每行有兩個正整數,用空格隔開,分別表示一條邊的起點和終點。每條邊出現一次且僅一次,圖中不存在自身環和重邊。輸入文件最后一行為0 0,表示輸入數據結束。
【輸出描述】:
對輸入文件的每個有向圖,輸出兩行:第一行為n個正整數,表示每個頂點的出度;第2行也為n個正整數表示每個頂點的入度。每兩個正整數之間用一個空格隔開,每行的最后一個正整數之后沒有空格。
【樣例輸入】
7 9
1 2
2 3
2 5
2 6
3 5
4 3
5 2
5 4
6 7
0 0
【樣例輸出】
1 3 1 1 2 1 0
0 2 2 1 2 1 1
詳解代碼如下:
1 #include<string.h> 2 #include<stdio.h> 3 #define MAXN 100 //頂點個數最大值 4 int Edge[MAXN][MAXN]; //鄰接矩陣 5 int main(){ 6 int i,j; //循環變量 7 int n,m; //頂點的個數、邊數 8 int u,v; //邊的起點與終點 9 int od,id; //頂點的出度與入度 10 while(1) 11 { 12 scanf("%d%d",&n,&m); //讀入定點個數n和邊數m 13 if(n==0&&m==0) break; //輸入數據結束 14 memset(Edge,0,sizeof(Edge)); 15 for(i=1;i<=m;i++) 16 { 17 scanf(" %d%d",&u,&v); //讀入邊的起點與終點 18 Edge[u-1][v-1] = 1; //構造鄰接矩陣 19 } 20 for(i=0;i<n;i++) //求各頂點的出度 21 { 22 od = 0; 23 for(j=0;j<n;j++) od+=Edge[i][j]; //累加到第i行 24 if(i==0) printf(" %d",od); 25 else printf(" %d",od); 26 } 27 printf("\n"); 28 for(i=0;i<n;i++) //求各頂點的入度 29 { 30 id=0; 31 32 for(j=0;j<n;j++) id+=Edge[j][i]; //累加到第i列 33 if(i==0) printf(" %d",id); 34 else printf(" %d",id); 35 } 36 printf("\n"); 37 } 38 return 0; 39 }