Codeforces 232A Cycles 比較有趣的思路題
John Doe started thinking about graphs. After some thought he decided that he wants to paint an undirected graph, containing exactly k cycles of length 3.
A cycle of length 3 is an unordered group of three distinct graph vertices a, b and c, such that each pair of them is connected by a graph edge.
John has been painting for long, but he has not been a success. Help him find such graph. Note that the number of vertices there shouldn't exceed 100, or else John will have problems painting it.
InputA single line contains an integer k (1 ≤ k ≤ 105) — the number of cycles of length 3 in the required graph.
In the first line print integer n (3 ≤ n ≤ 100) — the number of vertices in the found graph. In each of next
n lines print n characters "0" and "1": the
i-th character of the
j-th line should equal "0", if vertices
i and j do not have an edge between them, otherwise it should equal "1". Note that as the required graph is undirected, the
i
1Output
3 011 101 110Input
10Output
5 01111 10111 11011 11101 11110題目大意:
已知圖中的三條邊可以形成一個三角形。現給定k個三角形(k<10^5),求圖的鄰接矩陣。節點數n<=100;
解題思路:
首先用排列組合的方法確定最少的完全圖。然後計算,每新增一個點,將與完全圖中的兩個點形成一個新的三角形。
通過這種方法,貪心把圖求出來。
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
int f[111][111];
memset(f,0,sizeof(f));
f[0][0]=f[1][0]=f[1][1]=f[2][2]=f[2][0]=1;
f[2][1]=2;
for( int i=3;i<=100;i++ )
{
for( int j=0;j<=3;j++ )
f[i][j]=f[i-1][j-1]+f[i-1][j];
}
int n;
while( scanf("%d",&n)!=EOF )
{
int i,j,ans,m[111][111];
memset( m,0,sizeof(m) );
for( i=2;n>=f[i+1][3];i++ ) ;
n-=f[i][3];
//printf("n=%d %d\n",n,i);
ans=i;
for( i=1;i<=ans;i++ ) for( j=1;j<=ans;j++ )
m[i][j]=i==j?0:1;
while( n )
{
for( i=2;n>=f[i+1][2];i++ ) ;
n-=f[i][2]; ans++;
for( j=1;j<=i;j++ )
m[ans][j]=m[j][ans]=1;
}
printf("%d\n",ans);
for( i=1;i<=ans;i++ )
{
for( j=1;j<=ans;j++ )
printf("%d",m[i][j]);
printf("\n");
}
}
return 0;
}