- #include<stdio.h>
- #include<stdlib.h>
- void makemap(int **map,int *early,int *late,int n)
- {
- for(int i=0;i<n;i++)//当前被判断活动
- for(int j=i+1;j<n;j++)//其余活动
- {
- if((early[i]>=early[j]&&early[i]<=late[j])||
- (late[i]>=early[j]&&late[i]<=late[j]))
- {//判断当前活动与其余活动是否交叉
- map[i][j]=map[j][i]=1;//交叉的话在图上做标记
- map[i][i]++;//记录与当前活动交叉活动的数目
- map[j][j]++;
- }
- }
- }//标记交叉活动
- void sortpoint(int **map,int *node,int low,int high)
- {
- int i,j,temp,t,x;
- if(low<high)
- {
- t=rand()%(high-low+1)+low;
- temp=node[t];
- node[t]=node[low];
- node[low]=temp;
- i=low;
- j=high;
- x=node[i];
- do
- {
- while(i<j && map[node[j]][node[j]]>=map[x][x]) j--;
- if(i<j) {node[i]=node[j];i++;}
- while(i<j && map[node[i]][node[i]]<map[x][x]) i++;
- if(i<j) {node[j]=node[i];j--;}
- }while(i!=j);
- node[i]=x;
- sortpoint(map,node,low,i-1);
- sortpoint(map,node,i+1,high);
- }
- }//依照活动与其他活动交叉的数目对活动进行随机快速排序
- //形成递增序列
- void colorit(int **map,int *node,int n)
- {
- int *color;
- color=(int *)malloc((sizeof(int))*n);
- for(int i=0;i<n;i++)color[i]=0;
- color[node[n-1]]=0;
- for(int i=n-2;i>=0;i--)
- {
- int elem[5]={0,0,0,0,0};
- for(int j=i+1;j<n;j++)
- if(map[i][j])elem[color[j]]=1;
- //根据图五色原理
- //设置数组标记与当前活动交叉且已分配会场的活动的举办会场
- for(int j=0;j<5;j++)
- if(elem[j]==0)
- {
- color[i]=j;
- break;
- }
- //根据标记会场数组分配当前活动举办会场
- }
- int count=0;
- for(int i=0;i<n;i++)
- if(color[i]>count)count=color[i];
- count++;
- printf("%d",count);
- //统计开设会场的数目(结果)
- }//为每个活动分配会场
- int main()
- {
- int n;
- scanf("%d",&n);
- //活动数目n
- int **map;
- map=(int **)malloc((sizeof(int *))*n);
- for(int i=0;i<n;i++)
- map[i]=(int *)malloc((sizeof(int))*n);
- //用于记录活动间的交叉情况
- int *early;
- int *late;
- early=(int *)malloc((sizeof(int))*n);
- late=(int *)malloc((sizeof(int))*n);
- //用于记录活动的开始时间和结束时间
- for(int i=0;i<n;i++)
- {
- scanf("%d %d",&early[i],&late[i]);
- for(int j=0;j<n;j++)map[i][j]=0;
- }
- makemap(map,early,late,n);
- int *node;
- node=(int *)malloc((sizeof(int))*n);
- for(int i=0;i<n;i++)node[i]=i;
- sortpoint(map,node,0,n-1);
- colorit(map,node,n);
- return 0;
- }