Intervals--POJ 1201

1、题目类型:差分约束系统、SPFA算法。

2、解题思路:(1)根据输入输入构图,并非简单的对输入进行构图,根据差分约束系统的理解,每个结束节点+1,而且第 i 个节点到第 i+1 个节点的权值为0、第 i+1 个节点到第 i 个节点的权值为-1;(2)SPAF算法寻找最短路径,是该路径的权值最大,初始状态下为-inf。

3、注意事项:构图是解决差分约束系统这类题的关键,根据择优的不同,合适的选择SPFA的判断条件。

4、实现方法:

  
    
#include < iostream >
#include
< vector >
#include
< algorithm >
#include
< queue >
using namespace std;
#define inf -10000000

struct Edge
{
int v,c;
};

vector
< Edge > head[ 50010 ];
int n,MaxP;
int mindis[ 50010 ];

void Init()
{
int i,a,b,c;
Edge E;
MaxP
=- 1 ;
cin
>> n;
for (i = 0 ;i < n;i ++ )
{
scanf(
" %d%d%d " , & a, & b, & c);
if (a > b)
swap(a,b);
E.v
= b + 1 ;
E.c
= c;
head[a].push_back(E);
if (MaxP < b)
MaxP
= b;
}
for (i = 0 ;i <= MaxP;i ++ )
{
E.v
= i;
E.c
=- 1 ;
head[i
+ 1 ].push_back(E);
E.v
= i + 1 ;
E.c
= 0 ;
head[i].push_back(E);
mindis[i]
= inf;
}
mindis[
0 ] = 0 ;
mindis[MaxP
+ 1 ] = inf;
}

void SPFA()
{
queue
< int > Q;
int vis[ 50010 ] = { 0 };
Q.push(
0 );
vis[
0 ] = 1 ;
while ( ! Q.empty())
{
int u = Q.front();
Q.pop();
vis[u]
= 0 ;
for ( int i = 0 ;i < head[u].size();i ++ )
{
if (mindis[head[u][i].v] < mindis[u] + head[u][i].c)
{
mindis[head[u][i].v]
= mindis[u] + head[u][i].c;
if ( ! vis[head[u][i].v])
{
vis[head[u][i].v]
= 1 ;
Q.push(head[u][i].v);
}
}
}
}
}

void Solve()
{
SPFA();
cout
<< mindis[MaxP + 1 ] << endl;
}

int main()
{
Init();
Solve();
return 0 ;
}

 

你可能感兴趣的:(poj)