zoukankan      html  css  js  c++  java
  • poj Layout 差分约束+SPFA

    题目链接:http://poj.org/problem?id=3169

    很好的差分约束入门题目,自己刚看时学呢

    代码:

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<queue>
      6 using namespace std;
      7 #define INF  0x3f3f3f3f 
      8 #define maxn 1010
      9 int dis[maxn];
     10 int path[maxn];
     11 int inq[maxn];
     12 int cnt[maxn];
     13 class node
     14 {
     15     public:
     16     int to;
     17     int w;
     18     int next;
     19 };
     20 node edge[maxn*10];
     21 int head[maxn*3];
     22 int tol;
     23 int n,ML,MD;
     24 void add(int u,int v,int w)
     25 {
     26    edge[tol].to=v;
     27    edge[tol].w =w;
     28    edge[tol].next=head[u];
     29    head[u]=tol++;
     30 };
     31 queue<int>Q;
     32 bool SPFA()
     33 {
     34       memset(inq,0,sizeof(inq));
     35       memset(cnt,0,sizeof(cnt));
     36       int v0=1;
     37      for(int i=1;i<=n;i++)
     38      {
     39          dis[i]=INF;
     40          path[i]=v0;
     41          inq[i]=0;
     42      }
     43      dis[v0]=0;
     44      path[v0]=v0;
     45      inq[v0]++;
     46      cnt[v0]++;
     47      Q.push(v0);
     48      while(!Q.empty())
     49      {
     50           int u=Q.front();
     51           Q.pop();
     52           inq[u]--;
     53           int tmp=head[u];
     54 
     55 
     56           while(tmp!=-1)
     57           {
     58               int v=edge[tmp].to;
     59               int w=edge[tmp].w;
     60               if(dis[v]>dis[u]+w)
     61               {
     62                   dis[v]=dis[u]+w;
     63                   path[v]=u;
     64                   if(inq[v]==0)
     65                   {
     66                      inq[v]++;
     67                      if(++cnt[v]>n) return false;
     68                      Q.push(v);
     69                     
     70                   }
     71               }
     72               tmp=edge[tmp].next;
     73           }
     74      }
     75      return true;
     76 }
     77 int main()
     78 {
     79    int a,b,d;
     80   while(scanf("%d%d%d",&n,&ML,&MD)!=EOF)
     81   {
     82       tol=0;
     83       memset(head,-1,sizeof(head));
     84       while(ML--)
     85       {
     86            scanf("%d%d%d",&a,&b,&d);
     87            add(a,b,d);
     88 
     89       }
     90       while(MD--)
     91       {
     92           scanf("%d%d%d",&a,&b,&d);
     93           add(b,a,-d);
     94       }
     95       if(!SPFA()) cout<<"-1"<<endl;
     96        else
     97          if(dis[n]>=INF) cout<<"-2"<<endl;
     98             else cout<<dis[n]<<endl;
     99 
    100 
    101   }
    102   return 0;
    103 }
  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/poj3169.html
Copyright © 2011-2022 走看看