POJ 2240 Bellman-Ford 求正权环

#include<iostream>//AC
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
const int maxe=2500;
const int maxv=50;
map<string,int> mmap;
int cnt;
double dis[maxv];
struct Edge {
    int from,to;
    double val;
} edge[maxe];
void init() {
    cnt=0;
}
void addedge(int from,int to,double val) {
    edge[cnt].from=from;
    edge[cnt].to=to;
    edge[cnt++].val=val;
}
bool Bellman_Ford(int s,int n,int cnt,Edge edge[]) {
    memset(dis,0,sizeof dis);//第一开始为了降低函数的耦合性,我传了5个参数,最后一个参数是 int dist[] 然后这里memset(dist),一直WA,按了一下F2,发现日志中有个警告,才发现memset sizeof指针了,memset等于无效了
    dis[s]=1;
    for(int i=1; i<=n; i++) {
        for(int j=0; j<cnt; j++) {
            if(dis[edge[j].to]<dis[edge[j].from]*edge[j].val)
                dis[edge[j].to]=dis[edge[j].from]*edge[j].val;
        }
    }
    if(dis[s]>1.0)
        return true;
    else
        return false;
}

int main(void) {
#ifndef ONLINE_JUDGE
    freopen("E:\\input.txt","r",stdin);
#endif // ONLINE_JUDGE
    int kase=0,n,m;
    while(cin>>n&&n) {
        init();
        mmap.clear();//TODO:我觉得没有这个也没有事情
        string s,s1,s2;
        for(int i=1; i<=n; i++)
            cin>>s,mmap[s]=i;
        cin>>m;
        double rate;
        for(int i=0; i<m; i++) {
            cin>>s1>>rate>>s2;
            addedge(mmap[s1],mmap[s2],rate);
        }
        int i;
        for(i=1; i<=n; i++)//因为任意一个结点上有正权环都可以输出“YES”,所以我们这里遍历所有结点。
            if(Bellman_Ford(i,n,cnt,edge))
                break;
        cout<<"Case "<<++kase<<": ";
        if(i==n+1)
            cout<<"No"<<endl;
        else
            cout<<"Yes"<<endl;
    }
    return 0;
}
#include<iostream>//WA
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
const int maxe=2500;
const int maxv=50;
map<string,int> mmap;
int cnt;
double dis[maxv];
struct Edge {
    int from,to;
    double val;
} edge[maxe];
void init() {
    cnt=0;
}
void addedge(int from,int to,double val) {
    edge[cnt].from=from;
    edge[cnt].to=to;
    edge[cnt++].val=val;
}
bool Bellman_Ford(int s,int n,int cnt,Edge edge[]) {
    bool flag;
    dis[s]=1;
    for(int i=1; i<=n; i++) {
        flag=false;
        for(int j=0; j<cnt; j++) {
            if(dis[edge[j].to]<dis[edge[j].from]*edge[j].val){
                dis[edge[j].to]=dis[edge[j].from]*edge[j].val;
                flag=true;
            }
        }
        if(flag==false)
            break;
    }
    return flag;
}

int main(void) {
#ifndef ONLINE_JUDGE
    freopen("E:\\input.txt","r",stdin);
#endif // ONLINE_JUDGE
    int kase=0,n,m;
    while(cin>>n&&n) {
        init();
        string s,s1,s2;
        for(int i=1; i<=n; i++)
            cin>>s,mmap[s]=i;
        cin>>m;
        double rate;
        for(int i=0; i<m; i++) {
            cin>>s1>>rate>>s2;
            addedge(mmap[s1],mmap[s2],rate);
        }
        int i;
        cout<<"Case "<<++kase<<": ";
        if(Bellman_Ford(1,n,cnt,edge))//就这里有改动,我认为不用遍历所有结点,因为BF算法也可以找到非本结点的正权环,但是一直WA。以后填坑吧。
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

 

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/shadandeajian/article/details/81290526
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞