首页 > 代码库 > POJ 2983 Is the Information Reliable?

POJ 2983 Is the Information Reliable?

 

/**POJ 2983 Is the Information Reliable?*差分约束系统*(1)对于确定信息 P A B X, 有 A - B >= X && A - B <= X 即 B <= A + (-X) && A <= B + X*	即构成边<A, B, -X> 和 <B, A, X>*(2)对于不确定信息 V A B, 有 A - B >= 1, 即 B <= A + (-1)*	即构成边 <A, B, -1>*由于可能存在孤立点,需要加入超级源点 0, 构造 <0, Vi, 0> (i: [1,n] )*最终判定若有负值回路则输出 “Unreliable”*否则 “Reliable”*/#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 1010;struct ArcNode {	int to, w;	ArcNode *next;};int n, m;ArcNode *List[MAXN];bool visit[MAXN];int dist[MAXN];int cont[MAXN];bool spfa(int src){	queue<int > Q;	int i, u, v;	ArcNode *temp;	memset(dist, INF, sizeof(dist));	memset(visit, false, sizeof(visit));	memset(cont, 0, sizeof(cont));	dist[src] = 0;	Q.push(src);	cont[src] ++;	while (Q.size()) {		u = Q.front();		visit[u] = 0;		Q.pop();		temp = List[u];		while (temp != NULL) {			v = temp->to;			if (dist[v] > dist[u] + temp->w) {				dist[v] = dist[u] + temp->w;				if (!visit[v]) {					visit[v] = 1;					cont[v] ++;					if (cont[v] > n) {						return false;					}					Q.push(v);				}			}			temp = temp->next;		}	}	return true;}int main(){	int i;	int u, v, w;	char s[5];	while (~scanf("%d %d", &n, &m)) {		memset(List, 0, sizeof(List));		ArcNode *temp;		for (i = 1; i <= n; i++) {			temp = new ArcNode;			temp->to = i;   temp->w = 0;    temp->next = NULL;			if (List[0] == NULL) {				List[0] = temp;			} else {				temp->next = List[0];   List[0] = temp;			}		}		for (i = 0; i < m; i++) {			scanf("%s", s);			if (s[0] == ‘P‘) {				scanf("%d %d %d", &u, &v, &w);				temp = new ArcNode;				temp->to = v;   temp->w = -w;   temp->next = NULL;				if (List[u] == NULL) {					List[u] = temp;				} else {					temp->next = List[u];   List[u] = temp;				}				temp = new ArcNode;				temp->to = u;   temp->w = w;    temp->next = NULL;				if (List[v] == NULL) {					List[v] = temp;				} else {					temp->next = List[v];   List[v] = temp;				}			}			if (s[0] == ‘V‘) {				scanf("%d %d", &u, &v);				temp = new ArcNode;				temp->to = v;   temp->w = -1;    temp->next = NULL;				if (List[u] == NULL) {					List[u] = temp;				} else {					temp->next = List[u];   List[u] = temp;				}			}		}		if (spfa(0)) {			printf("Reliable\n");		} else {			printf("Unreliable\n");		}	}}

  

POJ 2983 Is the Information Reliable?