[bsoj1331] 工厂的烦恼

来源:互联网 发布:淘宝分享红包怎么用 编辑:程序博客网 时间:2024/05/17 03:26

题目描述

某工厂发现厂里的机器在生产产品时要消耗大量的原材料,也就是说,有大量的原材料变成了废物。因此厂里想找出消耗原材料最大的一条生产线路进行改造,以降低成本。厂里的生产线路是一个有向无环网络,有N台机器分别代表网络中的N个结点。弧< I,j >(i < j)表示原材料从机器i传输到机器j的损耗数量。


输入格式

第一行是两个整数N,M(N<=100,M<=1000),分别表示网络的结点个数和弧数。第二行至M+1行,每行三个整数A,B,C,表示弧上的损耗为C。


输出格式

仅一个整数,为损耗最大的线路的损耗量。


样例数据

样例输入

5 5
1 2 2
2 4 9
1 3 7
3 4 1
4 5 6

样例输出

17


题目分析

这题目数据略水,怎么写怎么过。。。明明是错的代码却AC了,害得我后一道题调了半天。。。
裸最长路,用floyd,关键路径,spfa都能过,这里给关键路径和spfa的代码。


源代码

关键路径

#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;inline const int Get_Int() {    int num=0,bj=1;    char x=getchar();    while(x<'0'||x>'9') {        if(x=='-')bj=-1;        x=getchar();    }    while(x>='0'&&x<='9') {        num=num*10+x-'0';        x=getchar();    }    return num*bj;}int n,m,InDegree[1005],sum=0,Topsort[1005],map[505][505],dist[1005];bool Top_Sort() {    for(int i=1; i<=n; i++) {        int j=1;        while(j<=n&&InDegree[j])j++;  //寻找入度为0的点        if(j>n)return false;  //找不到        sum++;        Topsort[sum]=j;        InDegree[j]=-1;  //已经删除        for(int k=1; k<=n; k++)if(map[j][k])InDegree[k]--;  //断开与j相连的边    }    return true;}int main() {    n=Get_Int();    m=Get_Int();    for(int i=1; i<=m; i++) {        int x=Get_Int(),y=Get_Int(),v=Get_Int();        map[x][y]=v;        InDegree[y]++;    }    Top_Sort(); //按照top_sort顺序dp寻找最长路     for(int i=2; i<=n; i++)        for(int j=1; j<i; j++)            if(map[Topsort[j]][Topsort[i]]&&dist[Topsort[i]]<dist[Topsort[j]]+map[Topsort[j]][Topsort[i]])                dist[Topsort[i]]=(dist[Topsort[j]]+map[Topsort[j]][Topsort[i]]);    printf("%d\n",dist[Topsort[n]]);    return 0;}

spfa

#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;inline const int Get_Int() {    int num=0,bj=1;    char x=getchar();    while(x<'0'||x>'9') {        if(x=='-')bj=-1;        x=getchar();    }    while(x>='0'&&x<='9') {        num=num*10+x-'0';        x=getchar();    }    return num*bj;}const int maxn=20005;struct Edge {    int from,to,dist;};struct Spfa {    int n,m;    vector<Edge>edges;    vector<int>G[maxn];    bool inque[maxn];    int dist[maxn],used[maxn],path[maxn];    void init(int n) {        this->n=n;        edges.clear();        for(int i=1; i<=n; i++)G[i].clear();    }    void AddEdge(int from,int to,int dist) {        edges.push_back((Edge) {            from,to,dist        });        m=edges.size();        G[from].push_back(m-1);    }    bool main(int s) {        for(int i=1; i<=n; i++)dist[i]=0x7fffffff/2;        memset(inque,0,sizeof(inque));        deque<int>Q;        Q.push_back(s);        dist[s]=0;        path[s]=s;        inque[s]=1;        used[s]++;        while(!Q.empty()) {            int Now=Q.front();            Q.pop_front();            inque[Now]=0;            for(int i=0; i<G[Now].size(); i++) {                Edge& e=edges[G[Now][i]];                int Next=e.to;                if(dist[Next]>dist[Now]+e.dist) {                    dist[Next]=dist[Now]+e.dist;                    path[Next]=Now;                    if(!inque[Next]) {                        used[Next]++;                        if(used[Next]==edges.size())return false; //负权回环                        if(!Q.empty()&&dist[Next]<dist[Q.front()])Q.push_front(Next); //SLF优化                        else Q.push_back(Next);                        inque[Next]=1;                    }                 }            }        }        return true;    }    void Output(int x) {        if(path[x]==x) {            cout<<x<<" ";            return;        }        Output(path[x]);        cout<<x<<" ";    }};Spfa LongestPath;int n,m;int main() {    n=Get_Int();    m=Get_Int();    LongestPath.init(n);    for(int i=1; i<=m; i++) {        int x=Get_Int(),y=Get_Int(),v=Get_Int();        LongestPath.AddEdge(x,y,-v);    }    LongestPath.main(1);    printf("%d\n",-LongestPath.dist[n]);    return 0;}

0 0
原创粉丝点击