spfa && poj1860

原文:點擊打開鏈接


poj1860:點擊打開鏈接

判斷是否存在正環。

bellman

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn=110;
const int maxm=220;

double dist[maxn],v,c[maxm][2];
int cnt,n,m,d[maxm][2],s;

int bellman()
{
    for(int i=1;i<=n;i++)
        dist[i]=0;
    dist[s]=v;
    for(int i=0;i<n-1;i++)
    {
        int flag=0;
        for(int j=0;j<cnt;j++)
        {
            int u=d[j][0];
            int v=d[j][1];
            if(dist[v]<(dist[u]-c[j][1])*c[j][0])
            {
                dist[v]=(dist[u]-c[j][1])*c[j][0];
                flag=1;
            }
            if(!flag)
                break;
        }
    }
    for(int j=0;j<cnt;j++){
        int u=d[j][0];
        int v=d[j][1];
        if(dist[v]<(dist[u]-c[j][1])*c[j][0])
            return 1;
    }
    return 0;
}

int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
    {
        int a,b;
        cnt=0;
        double x,y,e,f;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%lf%lf%lf%lf",&a,&b,&x,&y,&e,&f);
            d[cnt][0]=a;
            d[cnt][1]=b;
            c[cnt][0]=x;
            c[cnt][1]=y;
            cnt++;
            d[cnt][0]=b;
            d[cnt][1]=a;
            c[cnt][0]=e;
            c[cnt][1]=f;
            cnt++;
        }
        if(bellman())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

spfa

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#define inf 1e6
using namespace std;

struct node
{
    int v;
    double c,r;
};
node edge[3000];
double dist[3000],v1;
int cnt,n,m,s,vis[3000],num[3000],next[3000],f[3000];

int spfa()
{
    queue<int> q;
    for(int i=0;i<=n;i++)
        dist[i]=0;
    dist[s]=v1;

    q.push(s);vis[s]=1;num[s]++;
    while(!q.empty())
    {
        int x;
        x=q.front();q.pop();vis[x]=0;
        for(int i=f[x];i!=-1;i=next[i])
        {
            if(dist[edge[i].v]<(dist[x]-edge[i].c)*edge[i].r)
            {
                dist[edge[i].v]=(dist[x]-edge[i].c)*edge[i].r;
                if(!vis[edge[i].v])
                {
                    vis[edge[i].v]=1;
                    q.push(edge[i].v);
                    num[edge[i].v]++;
                }
                if(num[edge[i].v]>n)
                {
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&s,&v1)!=EOF)
    {
        memset(f,-1,sizeof(f));
        memset(vis,0,sizeof(vis));
        memset(num,0,sizeof(num));
        cnt=0;
        for(int i=0;i<m;i++)
        {
            int a,b;
            double c,d,e,x;
            scanf("%d%d%lf%lf%lf%lf",&a,&b,&c,&d,&e,&x);
         //   edge[cnt].u=a;
            edge[cnt].v=b;
            edge[cnt].r=c;
            edge[cnt].c=d;
            next[cnt]=f[a];
            f[a]=cnt;
            cnt++;
         //   edge[cnt].u=b;
            edge[cnt].v=a;
            edge[cnt].r=e;
            edge[cnt].c=x;
            next[cnt]=f[b];
            f[b]=cnt;
            cnt++;
        }
        if(spfa())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章