poj2983-差分约束判定存在&正环与负环-Is the Information Reliable?

https://vjudge.net/problem/POJ-2983
给定一些坐标的位置,问你这些坐标的摆放是否合理。
① P x y c,说明x再y左边c米处。
② V x y 说明x在y 左边。
差分约束,大佬的博客。
http://blog.csdn.net/consciousman/article/details/53812818
poj2983-差分约束判定存在&正环与负环-Is the Information Reliable?_第1张图片

poj2983-差分约束判定存在&正环与负环-Is the Information Reliable?_第2张图片

重点

1 求负环两种方法,dfs版的spfa就是这样(注意dfs中有回溯操作!可不是简单的判断是否存在松弛操作)
bfs版的是设置一个数组,初始节点为1,然后子节点=父节点+1,如果子节点超过n,那么必定存在负环(存在负环,必定超过n,而没有负环,必定小于等于n)
2 一开始 0节点在每个节点都创建一个为0的边是为了让图连通。比如说样例中123 存在负环,但是我们搜索是从0开始的。

#include 
#include 
#include 
using namespace std;
/*最长路 和最短路。
 用来判别差分约束 中的是否存在。
 若是求最短路,则是负环。
 若是最长路,则是正环。
 mdzz.
 另外,这种玩意用dfs版本的spfa比较快。
*/
const int maxn=2e5+3000;
struct Node{
   int to,next,cost;
}node[maxn];
int len;
int head[maxn];
void init(){
     len=0;
     memset(head,-1,sizeof(head));
}
void add(int a,int b,int c){
     node[len].to=b;
     node[len].cost=c;
     node[len].next=head[a];
     head[a]=len++;
}
bool ffl;
int dis[maxn];
bool vis[maxn];
void spfa(int k)
{     if(ffl) return ;
      vis[k]=true;
      for(int i=head[k];i!=-1;i=node[i].next)
      {   int w=node[i].to;
          int v=node[i].cost;
          if(dis[k]+v>dis[w])
            {  dis[w]=dis[k]+v;
                if(!ffl&&vis[w])
                {  //printf("YES\n");
                   ffl=true;
                   break;
                }
                else
                {  spfa(w);
                }
            }
      }
    vis[k]=false;//回溯
}
int main()
{   int m,n;
    char c2;
    int a,b,c;
    while(~scanf("%d%d",&m,&n)){
    init();
    for(int i=1;i<=m;i++){
       add(0,i,0); //为了不影响正环,我变成0或者-1,如果是负环,我就设1或者0。
    }
    c=1;
    for(int i=0;i
#include 
#include 
#include 
using namespace std;
/*最长路 和最短路。
 用来判别差分约束 中的是否存在。
 若是求最短路,则是负环。
 若是最长路,则是正环。
 mdzz.
 另外,这种玩意用dfs版本的spfa比较快。
*/
const int maxn=3e5+3000;
struct Node{
   int to,next,cost;
}node[maxn];
int len;
int head[maxn];
void init(){
     len=0;
     memset(head,-1,sizeof(head));
}
void add(int a,int b,int c){
     node[len].to=b;
     node[len].cost=c;
     node[len].next=head[a];
     head[a]=len++;
}
bool ffl;
int dis[maxn];
bool vis[maxn];
void spfa(int k)
{     if(ffl) return ;
      vis[k]=true;
      for(int i=head[k];i!=-1;i=node[i].next)
      {   int w=node[i].to;
          int v=node[i].cost;
          if(dis[k]+v

你可能感兴趣的:(图论)