这道题目很有意思,要求简化债务关系。一开始感觉很复杂,稍加分析后发现其实就是简化这个图,让这个图每个点出度为0或者入度为0,也就是说让欠账的人直接掏钱给差钱的人就行了。所以只要读一遍数据,看一下欠钱的一共欠了多少就可以了。
1 #include<cstdio> 2 #include<string.h> 3 using namespace std; 4 int cas = 1, n, deg[1005]; 5 int main() 6 { 7 while(scanf("%d", &n), n) 8 { 9 int ans0 = 0, ans1 = 0; 10 memset(deg, 0, n * 4); 11 for(int i = 0; i < n; i++) 12 { 13 for(int j = 0, x; j < n; j++) 14 { 15 scanf("%d", &x); 16 deg[i] -= x; 17 deg[j] += x; 18 ans0 += x; 19 } 20 } 21 for(int i = 0; i < n; i++) 22 { 23 if(deg[i] > 0)ans1 += deg[i]; 24 } 25 printf("%d. %d %d\n", cas++, ans0, ans1); 26 } 27 return 0; 28 }