POJ 3159 Candies 差分约束系统(dijsktra+前向星)

来源:互联网 发布:汉字书写教学软件 编辑:程序博客网 时间:2024/05/29 17:07

POJ 3159

题目大意

n个变量,满足m组约束条件,约束条件形如:xbxa+c,max(xnx1)

分析

要求最大值应该将约束条件转化为的形式

转化后条件变成:xbxac

然后就插入a指向b权值为c的边,从x1出发到xn的最小值

一开始写了个前向星+bfs版的spfa+STL queue=TLE,以为是STLqueue的原因,手写之后还是超时。

看了discuss后,上面说dfs版的spfa或dijkstra不会超时,于是改了dijkstra
一开始写dijjkstra还因为用结构体入的优先队列超时了,最后改成C++的pair过了,还好没让我手写堆。

代码

/*有向图前向星存边这道题没有成环的情况*/#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<map>#include<algorithm>#include<set>using namespace std;const int INF=0x7fffffff;//无穷大const int MAXN=30005;struct Edge{      int to;      int next;      int w;}edge[500005];int n,m;int edgecount;int Head[50005];bool vis[50005];int dis[50005];int q[100005];long long int head,tail;struct Node{      int num;      int dis;      bool operator < (const Node &rhs)const {          return dis>rhs.dis;      }}node[50005];void Init_edge(){      memset(Head,-1,sizeof(Head));      edgecount=0;}void Add_Edge(int u,int v,int w){     edge[++edgecount].to=v;     edge[edgecount].w=w;     edge[edgecount].next=Head[u];     Head[u]=edgecount;}typedef pair<int,int> P;void Dijkstra(int s){    for(int i=1;i<=n;i++)dis[i]=INF;    dis[s]=0;    priority_queue<P,vector<P>,greater<P> > Q;    Q.push(P(0,s));    while(!Q.empty())    {          P p=Q.top();          Q.pop();          int u=p.second;          if(dis[u]<p.first)continue;          for( int k=Head[u];k!=-1;k=edge[k].next)          {                int w=edge[k].w;                int v=edge[k].to;                if(dis[v]>dis[u]+w)                {                      dis[v]=dis[u]+w;                      Q.push(P(dis[v],v));                }          }    }}int main(){    int a,b,c;    while(scanf("%d%d",&n,&m)!=EOF)    {          Init_edge();          for(int i=1;i<=m;i++)          {                scanf("%d%d%d",&a,&b,&c);                Add_Edge(a,b,c);          }          Dijkstra(1);          printf("%d\n",dis[n]);    }    return 0;}
0 0
原创粉丝点击