const int maxn = 50008 ; struct Edge{ int v ; int w ; int next ; }e[maxn<<2] ; int g[maxn] , id ; inline void add(int u , int v , int w){ e[id].v = v ; e[id].w = w ; e[id].next = g[u] ; g[u] = id++ ; } queue<int> Q ; bool in[maxn] ; int dist[maxn] ; void spfa(int s){ while(! Q.empty()) Q.pop() ; memset(in , 0 , sizeof(in)) ; in[s] = 1 ; memset(dist , 63 , sizeof(dist)) ; dist[s] = 0 ; Q.push(s) ; while(! Q.empty()){ int u = Q.front() ; Q.pop() ; in[u] = 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; int w = e[i].w ; if(dist[u] + w < dist[v]){ dist[v] = dist[u] + w ; if(! in[v]){ in[v] = 1 ; Q.push(v) ; } } } } } int main(){ int n , i , mi , mx , a , b , c ; while(cin>>n){ id = 0 ; memset(g , -1 , sizeof(g)) ; mi = maxn + 10 ; mx = -1 ; for(i = 1 ; i <= n ; i++){ scanf("%d%d%d" ,&a ,&b ,&c) ; a++ ; b++ ; add(b , a-1 , -c) ; mi = min(a , mi) ; mx = max(b , mx) ; } for(i = mi ; i <= mx ; i++){ add(i-1 , i , 1) ; add(i , i-1 , 0) ; } spfa(mx) ; ; printf("%d\n" , -dist[mi - 1]) ; } return 0 ; }
把cij除到两边:l'<=ai/bj<=u',如果差分约束的话,应该是ai-bj的形式,于是可以取对数
log(l')<=log(ai)-log(bj)<=log(u')
把log(ai)和log(bj)看成两个点ai和bj,化成求最短路的形式:dis[ai]-dis[bj]<=log(u'),dis[bj]-dis[ai]<=-log(l')
然后判负环就行
注意的是,如果spfa队列判负环:
(1)不必判断某个点入队次数大于N,只要判断是否大于sqrt(1.0*N)
(2)或者所有点的入队次数大于T*N,即存在负环,一般T取2
N为所有点的个数
const int maxn = 1008 ; struct Edge{ int v ; double w ; int next ; }e[361000] ; int g[maxn] , id ; inline void add(int u , int v , double w){ e[id].v = v ; e[id].w = w ; e[id].next = g[u] ; g[u] = id++ ; } int Q[361000] ; bool in[maxn] ; int relax[maxn] ; double dist[maxn] ; int spfa(int N){ int head = 0 , tail = -1 ; for(int i = 1 ; i <= N ; i++){//加入虚拟源点 dist[i] = 0 ; Q[++tail] = i ; in[i] = 1 ; relax[i] = 1 ; } int limit = (int)sqrt(0.5 + N) ; while(head <= tail){ int u = Q[head++] ; in[u] = 0 ; if(relax[u] > limit) return 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; ; if(dist[u] + e[i].w < dist[v]){ dist[v] = dist[u] + e[i].w ; if(! in[v]){ in[v] = 1 ; relax[v]++ ; Q[++tail] = v ; } } } } return 1 ; } int main(){ int n , m , i , j ; double L , U , x ; while(scanf("%d%d%lf%lf" ,&n,&m,&L,&U) != EOF){ id = 0 ; memset(g , -1 , (n+m+1)*sizeof(int)) ; L = log(L) ; U = log(U) ; for(i = 1 ; i <= n ; i++){ for(j = 1 ; j <= m ; j++){ scanf("%lf" ,&x) ; x = log(x) ; add(n+j , i , U - x) ; add(i , n+j , x - L) ; } } if(spfa(n+m)) puts("YES") ; else puts("NO") ; } return 0 ; }
const int maxn = 1008 ; struct Edge{ int v ; int w ; int next ; }e[400008] ; int id , g[maxn] ; inline void add(int u , int v , int w){ e[id].v = v ; e[id].w = w ; e[id].next = g[u] ; g[u] = id++ ; } queue<int> Q ; int relax[maxn] ; bool in[maxn] ; int dist[maxn] ; int spfa(int s , int N){ while(! Q.empty()) Q.pop() ; for(int i = 0 ; i <= N ; i++){ dist[i] = 100000000 ; in[i] = 0 ; relax[i] = 0 ; } dist[s] = 0 ; Q.push(s) ; while(! Q.empty()){ int u = Q.front() ; Q.pop() ; in[u] = 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; if(dist[u] + e[i].w < dist[v]){ dist[v] = dist[u] + e[i].w ; if(! in[v]){ in[v] = 1 ; if(++relax[v] > N+1) return 0 ; Q.push(v) ; } } } } return 1 ; } int main(){ int i , n , m , a , b , c ; char s[2] ; while(cin>>n>>m){ memset(g , -1 , (n+1)*sizeof(int)) ; id = 0 ; while(m--){ scanf("%s" , s) ; if(s[0] == 'P'){ scanf("%d%d%d" , &a , &b , &c) ; add(b , a , c) ; add(a , b , -c) ; } else{ scanf("%d%d" , &a , &b) ; add(a , b , -1) ; } } for(i = 1 ; i <= n ; i++) add(0 , i , 0) ; if(spfa(0 , n)) puts("Reliable") ; else puts("Unreliable") ; } return 0 ; }
const int maxn = 1008 ; struct Edge{ int v ; int w ; int next ; }e[400008] ; int id , g[maxn] ; inline void add(int u , int v , int w){ e[id].v = v ; e[id].w = w ; e[id].next = g[u] ; g[u] = id++ ; } queue<int> Q ; int relax[maxn] ; bool in[maxn] ; int dist[maxn] ; int spfa(int s , int N){ while(! Q.empty()) Q.pop() ; for(int i = 0 ; i <= N ; i++){ dist[i] = 100000000 ; in[i] = 0 ; relax[i] = 0 ; } dist[s] = 0 ; Q.push(s) ; while(! Q.empty()){ int u = Q.front() ; Q.pop() ; in[u] = 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; if(dist[u] + e[i].w < dist[v]){ dist[v] = dist[u] + e[i].w ; if(! in[v]){ in[v] = 1 ; if(++relax[v] > N) return 0 ; Q.push(v) ; } } } } return 1 ; } int main(){ int i , n , m , a , b , k ; char s[2] ; while(cin>>n && n){ cin>>m ; memset(g , -1 , (n+2)*sizeof(int)) ; id = 0 ; while(m--){ scanf("%d%d%s%d" , &a , &b , s , &k) ; if(s[0] == 'l') add(a-1 , a+b , k-1) ; else add(a+b , a-1 , -1-k) ; } for(i = 0 ; i <= n ; i++) add(n+1 , i , 0) ; if(spfa(n+1 , n+2)) puts("lamentable kingdom") ; else puts("successful conspiracy") ; } return 0 ; }
const int maxn = 1008 ; struct Edge{ int v ; int w ; int next ; }e[400008] ; int id , g[maxn] ; inline void add(int u , int v , int w){ e[id].v = v ; e[id].w = w ; e[id].next = g[u] ; g[u] = id++ ; } queue<int> Q ; int relax[maxn] ; bool in[maxn] ; int dist[maxn] ; int spfa(int s , int N){ while(! Q.empty()) Q.pop() ; for(int i = 0 ; i <= N ; i++){ dist[i] = 100000000 ; in[i] = 0 ; relax[i] = 0 ; } dist[s] = 0 ; Q.push(s) ; while(! Q.empty()){ int u = Q.front() ; Q.pop() ; in[u] = 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; if(dist[u] + e[i].w < dist[v]){ dist[v] = dist[u] + e[i].w ; if(! in[v]){ in[v] = 1 ; if(++relax[v] > N) return 0 ; Q.push(v) ; } } } } return 1 ; } int main(){ int i , n , m , a , b , l , r , ok ; char s[2] ; while(cin>>n>>m){ memset(g , -1 , (n+2)*sizeof(int)) ; id = 0 ; ok = 0 ; while(m--){ scanf("%d%d%d%d" , &l , &r , &a , &b) ; add(r , l-1 , -a) ; add(l-1 , r , b) ; if(l > r) ok = 1 ; } if(ok){ puts("The spacecraft is broken!") ; continue ; } for(i = 1 ; i <= n ; i++){ add(i-1 , i , 10000) ; add(i, i-1 , 10000) ; } if(spfa(0 , n+1)){ printf("%d" , dist[1] - dist[0]) ; for(i = 2 ; i <= n ; i++) printf(" %d" , dist[i] - dist[i-1]) ; puts("") ; } else puts("The spacecraft is broken!") ; } return 0 ; }
const int maxn = 1008 ; struct Edge{ int v ; int w ; int next ; }e[10008] , e2[10008] ; int id , g[maxn] ; inline void add(int u , int v , int w){ e[id].v = v ; e[id].w = w ; e[id].next = g[u] ; g[u] = id++ ; } queue<int> Q ; int relax[maxn] ; bool in[maxn] ; int dist[maxn] ; int spfa(int s , int N){ while(! Q.empty()) Q.pop() ; for(int i = 0 ; i <= N ; i++){ dist[i] = 1000000000 ; in[i] = 0 ; relax[i] = 0 ; } dist[s] = 0 ; Q.push(s) ; while(! Q.empty()){ int u = Q.front() ; Q.pop() ; in[u] = 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; if(dist[u] + e[i].w < dist[v]){ dist[v] = dist[u] + e[i].w ; if(! in[v]){ in[v] = 1 ; if(++relax[v] > N) return 0 ; Q.push(v) ; } } } } return 1 ; } int spfa2(int s , int N){ while(! Q.empty()) Q.pop() ; for(int i = 0 ; i <= N ; i++){ dist[i] = -1000000000 ; in[i] = 0 ; relax[i] = 0 ; } dist[s] = 0 ; Q.push(s) ; while(! Q.empty()){ int u = Q.front() ; Q.pop() ; in[u] = 0 ; for(int i = g[u] ; i != -1 ; i = e[i].next){ int v = e[i].v ; if(dist[u] + e[i].w > dist[v]){ dist[v] = dist[u] + e[i].w ; if(! in[v]){ in[v] = 1 ; if(++relax[v] > N) return 0 ; Q.push(v) ; } } } } return 1 ; } int minans[maxn] , maxans[maxn] ; int la[maxn] , lb[maxn] , lc[maxn] ; int da[maxn] , db[maxn] , dc[maxn] ; int main(){ int i ,t , n , ml , md , a , b , c , T = 1 ; cin>>t ; while(t--){ cin>>n>>ml>>md ; memset(g , -1 , (n+2)*sizeof(int)) ; id = 0 ; for(i = 1 ; i <= ml ; i++){ scanf("%d%d%d" ,&a , &b , &c) ; add(a , b , c) ; la[i] = a , lb[i] = b , lc[i] = c ; } for(i = 1 ; i <= md ; i++){ scanf("%d%d%d" ,&a , &b , &c) ; add(b , a , -c) ; da[i] = a , db[i] = b , dc[i] = c ; } for(i = 2 ; i <= n ; i++) add(i , i-1 , -1) ; add(0 , 1 , 0) ; add(1 , 0 , 0) ; add(0 , n , 100000000) ; printf("Case #%d: " , T++) ; if(spfa(0 , n+1)){ for(i = 1 ; i <= n ; i++) maxans[i] = dist[i] ; } else{ puts("Not Exist!") ; continue ; } memset(g , -1 , (n+2)*sizeof(int)) ; id = 0 ; for(i = 1 ; i <= ml ; i++) add(lb[i] , la[i] , -lc[i]) ; for(i = 1 ; i <= md ; i++) add(da[i] , db[i] , dc[i]) ; for(i = 2 ; i <= n ; i++) add(i-1 , i , 1) ; add(0 , 1 , 0) ; add(1 , 0 , 0) ; add(n , 0 , -100000000) ; if(spfa2(0 , n+1)){ for(i = 1 ; i <= n ; i++) minans[i] = dist[i] ; } else{ puts("Not Exist!") ; continue ; } puts("Exist!") ; for(i = 1 ; i <= n ; i++) printf("%d %d\n" , minans[i] , maxans[i]) ; } return 0 ; }