版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}