layout(poj3169)

1,我似乎找到了些。。彻底学习解决这些东西的方法。。

2,嗯。。这个关键是你怎么能转换成图的思想。。图的问题。。打眼一看,我觉得一般人肯定看不出来。。

3,这个要用的BELLMANFORD算法,所以赶紧学学搞个模板。

4,学习知识最简单的方法就是拿个例子给你讲。

嗯,模板让我感觉奇奇怪怪的。

5,还好这代码一遍就过了

#include<iostream>
#include<algorithm>
#define max 1005
//const int max=1005;
const int INF=100000005;
using namespace std;
int n,ml,md;
int al[max],bl[max],dl[max];
int ad[max],bd[max],dd[max];
int d[max];
bool updated;
void update(int& x,int y)
{
    if(x>y)
    {
        x=y;
        updated=true;
    }
}
void bellmanford()
{
    for(int k=0;k<=n;k++)
    {
        updated=false;
        for(int i=0;i+1<n;i++)
        {
            if(d[i+1]<INF)
                update(d[i],d[i+1]);
        }
        for(int i=0;i<ml;i++)
        {
            if(d[al[i]-1]<INF) 
                update(d[bl[i]-1],d[al[i]-1]+dl[i]);
        }
        for(int i=0;i<md;i++)
        {
            if(d[bd[i]-1]<INF) update(d[ad[i]-1],d[bd[i]-1]-dd[i]);
        }
    }
    
}
int main(){
    cin>>n>>ml>>md;
    for(int i=0;i<ml;i++){cin>>al[i]>>bl[i]>>dl[i];
    }
    for(int i=0;i<md;i++){cin>>ad[i]>>bd[i]>>dd[i];
    }
    fill(d,d+n,0);
    bellmanford();
    if(updated)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    fill(d,d+n,INF);
    d[0]=0; 
    bellmanford();
    int res=d[n-1];
    if(res==INF) res=-2;
    cout<<res<<endl;
}

6,,

猜你喜欢

转载自www.cnblogs.com/beiyueya/p/12218046.html