您的位置:首页 > 其它

【POJ1021】Intervals (最短路解差分约束)

2016-04-10 16:30 295 查看
题目:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 50010
#define INF 0xfffffff

struct node
{
int x,y,c,next;
}t[Maxn*4];int len=0;

int first[Maxn],cnt[Maxn],dis[Maxn];
bool bq[Maxn],inq[Maxn];

int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;}

void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;
}

queue<int > q;

void spfa(int s)
{
memset(dis,63,sizeof(dis));
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
if(!q.empty()) q.pop();
dis[s]=0;inq[s]=1;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();inq[x]=0;
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(dis[y]>dis[x]+t[i].c)
{
dis[y]=dis[x]+t[i].c;
if(!inq[y])
{
q.push(y);
inq[y]=1;
}
}
}
}
}

int main()
{
int m,mx=0,mn=INF;
scanf("%d",&m);
memset(first,0,sizeof(first));
memset(bq,0,sizeof(bq));
for(int i=1;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);x++;y++;
ins(y,x-1,-c);
bq[x]=bq[y]=1;
mx=mymax(mx,y);mn=mymin(mn,x-1);
}
for(int i=mn;i<mx;i++) ins(i+1,i,0);
for(int i=mn;i<mx;i++) ins(i,i+1,1);
for(int i=mn;i<=mx;i++) ins(mx+1,i,0);
spfa(mx+1);
//for(int i=mn;i<=mx;i++) printf("%d %d\n",i,dis[i]);
printf("%d\n",dis[mx]-dis[mn]);
return 0;
}


[POJ1201]

感觉自己考虑问题总是不全面啊。

2016-04-10 16:31:30
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: