POJ 1201 Intervals G++ 差分约束 求最长路 spfa 背

#include <algorithm>
#include <cstdio>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define MAXN 50001
const int INF = 2e9;
//英语       看博友分析     抄博友程序     算导24.4 差分约束与最短路径   百度     差分约束   求最长路   spfa   背 
//博友图的数据结构更快 
//抄的多   
//抄博友分析 
//令sum(n)表示区间[1,n]中选了几个点           
//那么,显然有以下不等式 :           
//1. sum(n)- sum(n - 1) >= 0            
//2. sum(n) -  sum(n - 1) <= 1           
//3. sum(bi) - sum(ai-1) >= ci
struct nod
{
	int y;
	int zhi;
}; 
vector<nod> G[MAXN+5]; 
int n;
int theMin;
int theMax;
int dis[MAXN+5];
int inq[MAXN+5];
 
void add(int u,int v,int w)
{
	G[u].push_back((nod){v,w});
}
 
int spfa()
{
    for(int i = theMin; i <= theMax; i++){
        //inq[i] = 0;
        dis[i] = -INF;
    }
    	dis[theMin] = 0;	
		int i,cur,v;
		queue< int > q;
		q.push(theMin);
		inq[theMin] = 1;
		while (!q.empty())
		{
				cur = q.front();
				q.pop();
				inq[cur] = 0;//不加wa   不加是bfs    加是spaf 背 
				for (i = 0; i<G[cur].size(); i++ )
				{
						v = G[cur][i].y;
						if ( dis[cur] + G[cur][i].zhi > dis[v])
						{
								dis[v] = dis[cur] + G[cur][i].zhi;
								if (!inq[v])
								{
										inq[v] = 1;
										q.push(v);
								}
						}
				}
		}
		return dis[theMax];
}
 
int main() 
{	
    scanf("%d",&n);
    theMin = INF;
    theMax = -INF;
    for(int i = 0; i < n; i++){
    	int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        add(u,v+1,w);//百度 如果想连边后求最长路 那么将不等式变形为这种形式 d[x]>=d[y]+z y---x连一条权值为z的边
        theMin = min(theMin,u);
        theMax = max(theMax,v+1);
    }
    for(int i = theMin; i < theMax; i++){
        add(i,i+1,0);
        add(i+1,i,-1);
    }
    printf("%d\n",spfa());
	return 0;	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值