2530: [Poi2011]Party
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 364 Solved: 213
[ Submit][ Status][ Discuss]
Description
请输出该图的任意一个大小为N/3的团。 一个团的定义为节点的一个子集,该子集中的点两两有直接连边。 输入: 第一行是两个整数N,M。 接下来有M行,每行两个整数A,B,表示A和B有连边。保证无重边。
输出: N/3个整数,表示你找到的团。 数据范围:
3<=N<=3000,[3/2 n(2/3 n -1)]/2<=M<=[n(n-1)/2]
Input
In the first line of the standard input two integers, n and M(3<=N<=3000,[3/2 n(2/3 n -1)]/2<=M<=[n(n-1)/2]), are given, separated by a single space. These denote the number of Byteasar's friends and the number of pairs of his friends who know each other, respectively. Byteasar's friends are numbered from 1 to . Each of the following lines holds two integers separated by a single space. The numbers in line no.i+1(for i=1,2,...,m) are Ai and Bi(1<=Ai<Bi<=N), separated by a single space, which denote that the persons Ai and Bi now each other. Every pair of numbers appears at most once on the input.
Output
Sample Input
2 5
1 4
1 5
2 4
1 3
4 5
4 6
3 5
3 4
3 6
Sample Output
1 #include<cstring> 2 #include<cmath> 3 #include<cstdio> 4 #include<algorithm> 5 #include<iostream> 6 7 #define N 3007 8 9 #define Wb putchar(' ') 10 #define We putchar('\n') 11 #define rg register int 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 17 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 inline void write(int x) 21 { 22 if(x<0) putchar('-'),x=-x; 23 if (x==0) putchar(48); 24 int num=0;char c[15]; 25 while(x) c[++num]=(x%10)+48,x/=10; 26 while(num) putchar(c[num--]); 27 } 28 29 int n,m,cnt; 30 int a[N][N],vis[N]; 31 32 int main() 33 { 34 n=read(),m=read(); 35 for (rg i=1;i<=m;i++) 36 { 37 int x=read(),y=read(); 38 a[x][y]=a[y][x]=true; 39 } 40 for (int i=1;i<=n;i++) 41 for (int j=i+1;j<=n&&!vis[i];j++) 42 if (!vis[j]&&!a[i][j]) 43 vis[i]=vis[j]=true; 44 for (int i=1;i<=n&&cnt<n/3;i++) 45 if (!vis[i]) write(i),Wb; 46 }