当前位置: 代码迷 >> 综合 >> POJ 1201 SPFA 差分约束
  详细解决方案

POJ 1201 SPFA 差分约束

热度:58   发布时间:2024-01-20 20:53:54.0

一道很蛋疼的题... 虽然很明显的差分约束,但是我就是那么错了。N久N久啊~~到现在我还是不知道为甚么!!!虽然很明显的是差分约束题,而且网上的资料乱七八糟的.... 看到了两条有用的结论:

1.求最大值,采用最短路径求法。

2.求最小值,采用最长路径求法。

但是!为什么啊?为什么??看来我还是对图论理解不深啊....

稍后继续想想这题吧....

#include<iostream>
#include<queue>
#define INF 0x7F7F7F7F
#define MAXN 50005
using 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;
}