差分约束 [1](poj 3159)(简单)

来源:互联网 发布:工厂方法模式java 编辑:程序博客网 时间:2024/04/28 18:19

差分约束:其实就是解一组三角形不等式 A+c<=B;可通过建图求最短路求得;

这道题比较裸,正常建完图后求一次最短路就ok;就是在用spfa时不能用队列,会超时,拿一个数组模拟就行;

#include <iostream>

#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define oo 1<<30
#define M 155555
#define N 33333 
int n,num;
bool vis[N];
int dis[N],head[N];int q[M];
struct node{
int u,v,next,c;
}edge[M];
void addedge(int a,int b,int c)
{
edge[num].u=a;
edge[num].v=b;
edge[num].c=c;
edge[num].next=head[a];
head[a]=num++;
}
void spfa()
{
int x,y,d;
    int top=0;
    q[top++]=1;
memset(vis,0,sizeof(vis));
for(int  i=0;i<=n;i++)
dis[i]=oo;
dis[1]=0;
vis[1]=1;

while(top!=0)
{
       x=q[--top];
vis[x]=0;
for(int i=head[x];i!=-1;i=edge[i].next)
{
y=edge[i].v;
d=edge[i].c;
if(dis[x]+d<dis[y])
{
dis[y]=dis[x]+d;
if(!vis[y])
{
q[top++]=y;
vis[y]=1;
}
}
}
}
}
int main()
{ int m,a,b,c;
while(cin>>n>>m)
{
num=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&a,&b,&c);
addedge(a,b,c);
}
spfa();
cout<<dis[n]<<endl;
}
}
0 0
原创粉丝点击