题目链接:http://codeforces.com/contest/233/problem/C
题意:在一个无相图中有N个长度为3 的回路,输出符合条件的图。注意此图的节点数不得超过100
题解:贪心即可具体怎么贪心看代码。
#include <iostream> #include <cstring> using namespace std; bool vis[120][120]; int main() { int k , n; cin >> k; memset(vis , false , sizeof(vis)); vis[1][2] = vis[2][1] = true; //下面for的是遍历添加上去的点 for(int i = 3 ; i <= 100 ; i++) { n = i; for(int j = 1 ; j < i ; j++) { int sum = 0; //下面的for表示i与j连接之后如果还有一个点和它们两个相连那么就能构成三角形 for(int l = 1 ; l < j ; l++) { if(vis[j][l] && vis[i][l]) sum++; } //下面的if很关键,如果可以减点就减去并把这条边连上,否则就跳过。因为再添加一个点之后这个点所能贡献的三角形个数与上一个有关而且可以从1开始到n这就要看上一些点是怎么连的。 if(k >= sum) { k -= sum; vis[i][j] = vis[j][i] = true; } if(k == 0) break; } if(k == 0) break; } cout << n << endl; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= n ; j++) { cout << vis[i][j]; } cout << endl; } return 0; }