poj 1201 Intervals

//poj 1201 Intervals(1716为简单版)  差分约束
/*
题解: 第一道差分约束,转化为求最长路径。
引用:http://www.cppblog.com/initiate/archive/2010/04/03/111530.aspx
*/
#include <iostream>
#include <vector>
using namespace std;
const int size = 50000;
const int inf = 1<<28;
int n,m;
struct node
{
       int adj;
       int len;
       node(){}
       node(int a,int l):adj(a),len(l){}
};
vector<node> e[size+10];
int mark[size+10],wt[size+10],Q[size*20+10];

void spfa(int l,int r)
{
     int head=0,tail=0;
     Q[tail++]=l;
     memset(mark,0,sizeof(mark));
     mark[l]=1;
     for (int i=l;i<=r;i++) wt[i]=-inf;
     wt[l]=0;
     while (head<tail)
     {
           int k=Q[head++];
           mark[k]=0;
           for (int i=0;i<e[k].size();i++)
           {
               int j=e[k][i].adj;
               if (wt[j]<wt[k]+e[k][i].len)
               {
                          wt[j]=wt[k]+e[k][i].len;
                          if (!mark[j]){
                             Q[tail++]=j;
                             mark[j]=1;
                          }
               }
           }
     }
}
int main()
{
    while (scanf("%d",&n)!=EOF)
    {
          int a,b,c;
          int l=inf,r=0;
          for(int i=0;i<n;i++)
          {
                  scanf("%d%d%d",&a,&b,&c);
                  if (a>b) swap(a,b);
                  e[a].push_back(node(b+1,c));
                  l=min(l,a);
                  r=max(r,b+1);
          }
         
          for (int i=l;i<=r;i++)
          {
              e[i].push_back(node(i+1,0));
              e[i+1].push_back(node(i,-1));
          }
          spfa(l,r);
          printf("%d/n",wt[r]);
          for (int i=l;i<=r;i++) e[i].clear();
    }
    system("pause");
    return 0;
   
}

你可能感兴趣的:(poj 1201 Intervals)