和上題一樣的解法。代碼也一樣,一樣糾結了很久。一樣不知道為什麼!!
#include<iostream>#include<queue>#define MAXN 20001#define INF 0x7F7F7F7Fusing namespace std;struct Node{ int v,price; Node *next;}Edge[MAXN<<2],*ptr[MAXN];int N;int minV,maxV;int EdgeNum;void addEdge( int u,int v,int w ){ Node *p=&Edge[EdgeNum++]; p->v=v; p->price=w; p->next=ptr[u]; ptr[u]=p;}int dist[MAXN];void spfa( ){ bool used[MAXN]; queue<int>myQueue; while( !myQueue.empty() ) myQueue.pop(); memset( used,0,sizeof(used) ); memset( dist,0xFF,sizeof(dist) ); dist[minV]=0; myQueue.push(minV); while( !myQueue.empty() ) { int u=myQueue.front(); myQueue.pop(); Node *p=ptr[u]; used[u]=false; while( p ) { if( dist[p->v]<dist[u]+p->price ) { dist[p->v]=dist[u]+p->price; if( !used[p->v] ) { used[p->v]=true; myQueue.push(p->v); } } p=p->next; } } return ;} int main(){ while( scanf( "%d",&N )!=EOF ) { int i,j; int a,b; EdgeNum=0; maxV=0;minV=INF; for( i=0;i<=N;i++ ) ptr[i]=NULL; for( i=1;i<=N;i++ ) { scanf( "%d %d",&a,&b ); if( minV>a )minV=a; if( maxV<b+1 )maxV=b+1; addEdge( a,b+1,2 ); } for( i=minV;i<=maxV;i++ ) { addEdge( i,i+1,0 ); addEdge( i+1,i,-1 ); } spfa(); printf( "%d\n",dist[maxV] ); } return 0; }