poj 2983 差分约束 spfa和bellman_fond算法

第一次做这样的题,第一次写着代码,不熟,几乎都是看别人的然后又写的,先贴两个代码吧!然后再自己消化!

bellman-ford

#include<iostream>
#include<cstdio>
#include<cstring>
#include<climits>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define repd(i, a, b) for (int i=(a); i>=(b); --i)
#define exp 0.000000000001
#define N 10000000
typedef struct fun
{
	int u,v,w;
}rr;
fun link[200000];
int n,m,sum;
void bellmanford()
{
	int i,j;
	int dis[2000];
	for(i=0; i<=n; i++)
		dis[i]=999999999;
	for(i=1; i<n; i++)
		for(j=1; j<sum; j++)
		{
             if(dis[link[j].v]>dis[link[j].u]+link[j].w)
                dis[link[j].v]=dis[link[j].u]+link[j].w;
		}
	int sign=0;
	for(j=1; j<sum; j++)
             if(dis[link[j].v]>dis[link[j].u]+link[j].w)
			 {
				 sign=1;
				 break;
			 }
    if(sign==1)
		printf("Unreliable\n");
	else
		printf("Reliable\n");
}
int main()
{
	char s;
	int u,v,i,w;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		sum=1;
         for(i=1; i<=m; i++)
		 {
			 getchar();
			 scanf("%c",&s);
			 if(s=='P')
			 {
				 scanf("%d%d%d",&u,&v,&w);
				 link[sum].u=u;
				 link[sum].v=v;
				 link[sum++].w=-w;
				 link[sum].u=v;
				 link[sum].v=u;
				 link[sum++].w=w;
			 }
			 else
			 {
				 scanf("%d%d",&u,&v);
				 link[sum].u=u;
				 link[sum].v=v;
				 link[sum++].w=-1;
			 }
		 }
         bellmanford();
	}
	return 0;
}


 

spfa:

/*
对于精确信息,可以得出两个差分条件,b-a = c;可以化为b <=a+c && a <= b-c;
对于模糊信息,只能得出一个差分条件,可以化为 b - a <= 1;所以a <= b-1;说明b到a有一条长度为-1的边
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<queue>
using namespace std;
#define min(a,b) (a)>(b)?(b):(a)
typedef struct fun
{
	int v,w;
	int pre;
}rr;
fun link[300000];
int len[1005];
int n,m,sum;
void addpage(int u,int v,int w)
{  
	link[sum].v=v;
	link[sum].w=w;
	link[sum].pre=len[u];
	len[u]=sum++;
}
void spfa()
{
    bool vis[1005];
    int cout[1005];
	int i;
	int dis[1005];
	queue<int>q;
	for(i=0; i<=n; i++)
	{
		cout[i]=0;
		vis[i]=false;
		dis[i]=INT_MAX;
	}
    q.push(0);
	vis[0]=true;
	dis[0]=0;
	cout[0]++;
	while(!q.empty())
	{
		int k=q.front();
		vis[k]=false;
		q.pop();
		for(i=len[k];i>0; i=link[i].pre)
		{ 
			if(dis[link[i].v]>dis[k]+link[i].w)
			{
				dis[link[i].v]=dis[k]+link[i].w;
				if(vis[link[i].v]==false)
				{
					q.push(link[i].v);
					vis[link[i].v]=true;
					cout[link[i].v]++;
					if(cout[link[i].v]>n)					
					{
						printf("Unreliable\n");
						return ;
					}
				}
			}
		}
	}
	printf("Reliable\n");
}
int main()
{
	char s;
	int i,u,v,w;
	int sign;
	while(~scanf("%d%d",&n,&m))
	{
		sum=1; 
		for(i=0; i<=n; i++)
			len[i]=0;
		sign=0;
		for(i=1; i<=m; i++)
		{
			getchar();
			scanf("%c",&s);
			if(s=='P')
			{
			    scanf("%d%d%d",&u,&v,&w);
				addpage(u,v,-w);
				addpage(v,u,w);
			}
			else
			{
				scanf("%d%d",&u,&v);
				addpage(u,v,-1); 
	//			addpage(v,u,-1);
			}
		}
		for(i=0; i<=n; i++)
            addpage(0,i,0);
		if(sign==1)
			printf("Unreliable\n");
		else
		  spfa();
	}
	return 0;
}


 

你可能感兴趣的:(poj 2983 差分约束 spfa和bellman_fond算法)