2983 Is the Information Reliable?(差分约束系统)

Is the Information Reliable?
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 14629   Accepted: 4569

Description

The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years ago. Draco established a line of defense called Grot. Grot is a straight line with N defense stations. Because of the cooperation of the stations, Zibu’s Marine Glory cannot march any further but stay outside the line.

A mystery Information Group X benefits form selling information to both sides of the war. Today you the administrator of Zibu’s Intelligence Department got a piece of information about Grot’s defense stations’ arrangement from Information Group X. Your task is to determine whether the information is reliable.

The information consists of M tips. Each tip is either precise or vague.

Precise tip is in the form of P A B X, means defense station A is X light-years north of defense station B.

Vague tip is in the form of V A B, means defense station A is in the north of defense station B, at least 1 light-year, but the precise distance is unknown.

Input

There are several test cases in the input. Each test case starts with two integers N (0 < N ≤ 1000) and M (1 ≤ M ≤ 100000).The next M line each describe a tip, either in precise form or vague form.

Output

Output one line for each test case in the input. Output “Reliable” if It is possible to arrange N defense stations satisfying all the M tips, otherwise output “Unreliable”.

Sample Input

3 4
P 1 2 1
P 2 3 1
V 1 3
P 1 3 1
5 5
V 1 2
V 2 3
V 3 4
V 4 5
V 3 5

Sample Output

Unreliable
Reliable

Source


给你一些准确的信息和模糊的信息~让你判断是否成立~其实就是给你个差分约束系统让你看看是否有环~~

但要非常注意的是~用spfa需要建一个超级源点~来判断自身的负环(1 1 V 1 1这组数据)还有要注意本身不成立的情况

(2 2 P 1 2 1 P 1 2 2)这是不成立的。

#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
int m, n;
#define inf 0x3f3f3f3f
int head[10000];
struct edge
{
	int to;
	int ne;
	int len;
}ed[200005];
int time[10000];
bool vis[10000];
int d[10000];
int cnt = 0;
void init()
{
	for (int s = 0; s <= 9999; s++)
	{
		head[s] = -1;
	}
	for (int s = 0; s <= n; s++)
	{
		d[s] = inf;
	}
	memset(vis, 0, sizeof(vis));
	memset(time, 0, sizeof(time));
}
void add(int from, int to, int len)
{
	ed[cnt].to = to;
	ed[cnt].len = len;
	ed[cnt].ne = head[from];
	head[from] = cnt++;
}
bool spfa() 
{
	queue<int>q;
	memset(time, 0, sizeof(time));
	q.push(0); d[0] = 0;
	while (!q.empty()) 
	{
		int t = q.front(); 
		q.pop();
		vis[t] = 0;
		for (int i = head[t]; i != -1; i = ed[i].ne)
		{
			if (d[t] + ed[i].len<d[ed[i].to])
			{
				d[ed[i].to] = d[t] + ed[i].len;
				if (!vis[ed[i].to]) 
				{
					vis[ed[i].to] = 1;
					q.push(ed[i].to);
					if (++time[ed[i].to] > n)
					{
						return 0;
					}
				}
			}
		}
	}
	return 1;
}
int main()
{
	while (cin >> n >> m)
	{
		int l = 0;
		cnt = 0;
		init();
		char ch;
		int a, b, c;
		for (int i = 0; i<m; i++)
		{
			getchar();
			scanf("%c", &ch);
			if (ch == '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 (int s = 1; s <= n; s++)
		{
			add(0, s, 0);
		}
		int ans = spfa();
		if (!ans)
		{
			cout << "Unreliable" << endl;
		}
		else
		{
			cout << "Reliable" << endl;
		}
	}
	return 0;
}

全部评论

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务