poj3259 Bellman_ford

我感觉对Bellman_ford理解得太浅了,很想知道逐边松弛和按点来松弛有什么区别,感觉都是每条边松弛|V|-1遍,然而后者就会wa。

参考了好几篇ac的代码,改了方法之后才成功的,而且貌似时间用的好多。

我总算是有点理解为什么普遍地用数组了,就算开得很大,也要比dynamic的各种结构要快很多并且占的容量少。

我最后的代码和网上的另一篇很像(其实是参考着写的),我觉得他的注释十分易懂,所以贴上他的博客链接:

http://blog.csdn.net/freezhanacmore/article/details/9712799

一下贴我的代码:

#include <iostream>
#include <vector>
using namespace std;
struct edge{
    int u,v;
    int d;
    edge(int U, int V, int D){
        u=U;
        v=V;
        d=D;
    }
};
int INF = 10000;
int n;
vector<edge> edges;
int d[510];
bool bellman_ford(){
    for(int i=0;i<n;i++) d[i] = INF;
    d[0]=0;
    
    for(int i=0;i<n-1;i++){
        bool flag = true;
        for(int j=0;j<edges.size();j++){
            int u = edges[j].u;
            int v = edges[j].v;
            int t = edges[j].d;
            
            if(d[v]>d[u]+t){
                d[v] = d[u] + t;
                flag = false;
            }
            
            
        }
        if(flag) return false;
    }
    
    for(int j=0;j<edges.size();j++){
        if(d[edges[j].v] > d[edges[j].u] + edges[j].d)
            return true;
    }
    return false;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    int Case_no;
    int num_path,num_hole;
    cin>>Case_no;
    while(Case_no--){
        cin>>n>>num_path>>num_hole;
        if(!edges.empty())
            edges.clear();
        
        int u,v,d;
        for(int i=0;i<num_path;i++){
            cin>>u>>v>>d;
            edge e1(u,v,d);
            edges.push_back(e1);
            
            edge e2(v,u,d);
            edges.push_back(e2);
            
        }
        
        for(int i=0;i<num_hole;i++){
            cin>>u>>v>>d;
            edge e(u,v,-d);
            edges.push_back(e);
        }
        if(bellman_ford()) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值