您的位置:首页 > 其它

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

2010-07-26 15:22 441 查看
//差分约束系统
//这题比较对差分约束的构图比较直观
//eg.P 3 1 4
//4 =< s3 - s1 <= 4-----------(1)
//等价于  s3 - s1 <= 4--------(2)
//        s1 - s3 <= -4-------(3)
//V 4 5
//s4 - s5 >= 1  --------------(4)
//等价于  s5 - s4 <= -1-------(5)
//建立(2)(3)(5)的边就可以了,建立<=的差分系统,就必须求最短路,反之求最长路
//只与信息是否可靠,就是判断图中是否存在负权回路即可
//下面代码为SPFA做法
#include<iostream>
#include<queue>
#define INF 1000000000
#define MAX 1005
#define MAXM 210000//注意边数的数量,最坏情况2*M+1000(超级源点的边)
using namespace std;
int head[MAX],V[MAXM],next[MAXM],W[MAXM];
bool inq[MAX];
int cnt[MAX],dis[MAX];
int m,N,M;
char cmd;
int u,v,w;
void addEdge(int u,int v,int w)//添加边
{
V[m] = v;
W[m] = w;
next[m] = head[u];
head[u] = m++;
}
void buildGrapth()//构图函数
{
m = 0;
memset(head,-1,sizeof(head));
for(int i = 1;i <= N;++i)	addEdge(0,i,0);
while(M--)
{
scanf("/n%c",&cmd);
if(cmd == 'P')
{
scanf("%d%d%d",&u,&v,&w);
addEdge(v,u,w);
addEdge(u,v,-w);
}
else
{
scanf("%d%d",&u,&v);
addEdge(u,v,-1);
}
}
}
bool SPFA()
{
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
queue<int> q;
for(int i = 1;i <= N;++i)	dis[i] = INF;
dis[0] = 0;
q.push(0);
inq[0] = 1;
while(!q.empty())
{
int u = q.front();	q.pop();
inq[u] = 0;
for(int e = head[u];e != -1;e = next[e])
{
if(dis[u] + W[e] < dis[V[e]])
{
dis[V[e]] = dis[u] + W[e];
if(!inq[V[e]])
{
q.push(V[e]);
inq[V[e]] = 1;
if(++cnt[V[e]] > N)	return 0;//通过元素入队次数判断是否存在回路
}
}
}
}
return 1;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M) != EOF)
{
buildGrapth();
if(SPFA())	printf("Reliable/n");
else printf("Unreliable/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: