Atcoder D - Score Attack

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_stage/article/details/77655021

http://abc061.contest.atcoder.jp/tasks/abc061_d
题意: 给个图,节点编号1-n,m条边,带环,有边权,求从1-n的最大花费。 并且如果存在无穷的情况输出inf (如样例)

思路: 一开始dfs t了,之后问了下我的dalao队友,dalao说裸的Bellman_Ford.还有你也可以去试下SPFA。 去敲吧。………… 好的,那么裸BellmanFord 如下,SPFA稍后补。

#include <bits/stdc++.h>
#define maxs 2020202
#define mkp make_pair
#define inf LONG_LONG_MAX
#define ll long long
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
vector< pair<ll,ll> >ed[maxs];
ll dis[maxs],n,m;
bool vis[maxs];

void Bellman_Ford(){
    fill(dis,dis+1+n,LONG_LONG_MAX);
    mme(vis,0);
    dis[1]=0;
    int sz;
    ll v,w;

    for(int k=1;k<n;k++){//无环
        for(int i=1;i<=n;i++){
           sz = ed[i].size();
           for(int j=0;j<sz;j++){

                v=ed[i][j].first,w = ed[i][j].second;
                if(dis[i]==LONG_LONG_MAX)
                    continue;
                if(dis[v]>dis[i]+w)
                    dis[v]=dis[i]+w;
           }
        }
    }

    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            sz = ed[i].size();
            for(int j=0;j<sz;j++){
                v=ed[i][j].first,w=ed[i][j].second;
                if(dis[i]==inf) continue;

                if(dis[v]>dis[i]+w){
                    vis[v]=1;
                    dis[v]=dis[i]+w;
                }
                if(vis[i]){
                    vis[v]=1;
                }
            }
        }
    }

    if(vis[n])
    puts("inf");
    else
        printf("%lld\n",-dis[n]);
}

int main()
{
    while(~scanf("%lld%lld",&n,&m))
    {
        ll u,v,w;
        for(int i=0;i<=n;i++) ed[i].clear();

        for(int i=1;i<=m;i++){
            scanf("%lld%lld%lld",&u,&v,&w);
            ed[u].push_back(mkp(v,-w));
        }
        Bellman_Ford();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/My_stage/article/details/77655021