题意:
给定一些节目单的时间,求最多能看完整的节目数。
把这些节目当成点,若下一个节目在上一个节目时间之后 则连上一条有向边 最后枚举起点求最长路。。。。
View Code
1 #include<stdio.h> 2 #include<algorithm> 3 #include<queue> 4 using namespace std; 5 const int maxn = 105; 6 const int maxm = 10005; 7 const int inf = 99999999; 8 struct node{ 9 int s,t; 10 }; 11 node a[ maxn ]; 12 struct node2{ 13 int u,next; 14 }edge[ maxm ]; 15 int cnt,head[ maxn ]; 16 17 void init(){ 18 cnt=0; 19 memset( head,-1,sizeof( head )); 20 } 21 22 void addedge( int a,int b ){ 23 edge[ cnt ].u=b; 24 edge[ cnt ].next=head[ a ]; 25 head[ a ]=cnt++; 26 } 27 28 int dis[ maxn ],vis[ maxn ]; 29 int spfa( int s,int n ){ 30 //memset( vis,0,sizeof( vis )); 31 for( int i=0;i<n;i++ ){ 32 dis[ i ]=1; 33 vis[ i ]=0; 34 } 35 queue<int>q; 36 q.push( s ); 37 vis[ s ]=1; 38 dis[ s ]=1; 39 while( !q.empty() ){ 40 int now=q.front(); 41 q.pop(); 42 vis[ now ]=0; 43 for( int i=head[ now ];i!=-1;i=edge[ i ].next ){ 44 int nxt=edge[ i ].u; 45 if( dis[ nxt ]<dis[ now ]+1 ){ 46 dis[ nxt ]=dis[ now ]+1; 47 if( vis[ nxt ]==0 ){ 48 vis[ nxt ]=1; 49 q.push( nxt ); 50 } 51 } 52 } 53 } 54 int sum=dis[ s ]; 55 for( int i=0;i<n;i++ ) 56 sum=max( sum,dis[ i ]); 57 return sum; 58 } 59 60 int main(){ 61 int n; 62 while( scanf("%d",&n),n ){ 63 for( int i=0;i<n;i++ ){ 64 scanf("%d%d",&a[ i ].s,&a[ i ].t); 65 } 66 init(); 67 for( int i=0;i<n;i++ ){ 68 for( int j=0;j<n;j++ ){ 69 if( a[ j ].s>=a[ i ].t&&i!=j ){ 70 addedge( i,j ); 71 } 72 } 73 } 74 int ans=0; 75 for( int i=0;i<n;i++ ) 76 ans=max( ans,spfa( i,n ) ); 77 printf("%d\n",ans); 78 } 79 return 0; 80 }