everlasting的博客

A tweiphay OIer.

bzoj 2019: [Usaco2009 Nov]找工作 最长路

题目链接


显然就是找一个最长路

两个城市有路径就建一个权值为d的边

如果有航线就建一个权值为d-z的边

边的权值表示经过这个边可以获得多少钱

最后从起点开始跑最长路就好,答案对于每个点取max

有正环就是无解,跟判负环一样


代码:

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<queue>  
#include<vector>  
  
#define inf 999999999  
  
using namespace std;  
  
struct node{  
    int to,len;  
};  
  
int n,m1,m2,d,s;
vector<node>v[1010];  
int dis[1010];  
int num[1010];  
bool vis[1010];  
queue<int>q;  
bool f=true;  
  
void link(int x,int y,int z){  
    node t;  
    t.to=y;  
    t.len=z;  
    v[x].push_back(t);  
}  
  
void spfa(){  
    for(int i=1; i<=n; i++)dis[i]=0;  
    dis[s]=d;
    vis[s]=true;
    num[s]=1;
    q.push(s);  
    while(!q.empty()){  
        int t=q.front();
        q.pop();
        for(int i=0; i<v[t].size(); i++){  
            int to=v[t][i].to;
            int len=v[t][i].len;
            if(dis[to]<dis[t]+len){
                dis[to]=dis[t]+len;
                if(!vis[to]){
                    if(num[to]==n){
                        f=false;  
                        return;  
                    }  
                    vis[to]=true;  
                    q.push(to);  
                    num[to]++;  
                }  
            }  
        }  
        vis[t]=false;  
    }  
}

int main(){  
    scanf("%d%d%d%d%d",&d,&m1,&n,&m2,&s);  
    for(int i=0; i<m1; i++){  
        int x,y;  
        scanf("%d%d",&x,&y);  
        link(x,y,d);
    }  
    for(int i=0; i<m2; i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        link(x,y,d-z);
    }
    spfa();
    if(!f)printf("-1\n");
    else{
    	int Max=0;
    	for(int i=1; i<=n; i++)Max=max(Max,dis[i]);
    	printf("%d\n",Max);
    }
      
    return 0;  
}  


阅读更多
版权声明:本文为博主原创文章,想转载告诉QQ851627835一下就好。 https://blog.csdn.net/everlasting_20141622/article/details/77248659
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

bzoj 2019: [Usaco2009 Nov]找工作 最长路

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭