一道很蛋疼的題... 雖然很明顯的差分約束,但是我就是那麼錯了。N久N久啊~~到現在我還是不知道為甚麼!!!雖然很明顯的是差分約束題,而且網上的資料亂七八糟的.... 看到了兩條有用的結論:
1.求最大值,採用最短路徑求法。
2.求最小值,採用最長路徑求法。
但是!為什麼啊?為什嗎??看來我還是對圖論理解不深啊....
稍後繼續想想這題吧....
#include<iostream>#include<queue>#define INF 0x7F7F7F7F#define MAXN 50005using namespace std;struct Node{ int v; int price; Node *next;}Edge[MAXN<<2],*ptr[MAXN];int N;int dist[MAXN];int edgeNum;int maxV,minV;void addEdge( int u,int v,int val ){ Node *p=&Edge[edgeNum++]; p->v=v; p->price=val; p->next=ptr[u]; ptr[u]=p;}bool spfa(){ bool used[MAXN]; int cnt[MAXN]; memset( used,0,sizeof(used) ); memset( cnt,0,sizeof(cnt) ); memset( dist,0xFF,sizeof(dist) ); queue<int>myQueue; while( !myQueue.empty() ) myQueue.pop(); 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); if( ++cnt[p->v]>maxV ) return false; } } p=p->next; } } return true;}int main(){ while( scanf( "%d",&N )!=EOF ) { int i,j; int u,v,p; int edgeNum=0; for( i=0;i<MAXN;i++ ) ptr[i]=NULL; maxV=0; minV=INF; for( i=1;i<=N;i++ ) { scanf( "%d %d %d",&u,&v,&p ); if( v+1>maxV ) maxV=v+1; if( u<minV ) minV=u; addEdge(u,v+1,p); } for( i=minV;i<=maxV;i++ ) { addEdge( i,i+1,0 ); addEdge( i+1,i,-1 ); } spfa(); printf( "%d\n",dist[maxV] ); } return 0;}