[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
- [bsoj1331] 工厂的烦恼
- 工厂的烦恼
- 工厂的烦恼
- 工厂的烦恼
- SSL1762工厂的烦恼
- 工厂的烦恼
- 工厂的烦恼
- (ssl1616)工厂的烦恼
- 工厂的烦恼
- 工厂的烦恼
- SSL P1762 工厂的烦恼
- 【SSLGZ 1762】工厂的烦恼
- 工厂的烦恼-SSL 1762
- 文章标题SSL1762 工厂的烦恼
- SSL 1762——工厂的烦恼
- 我的烦恼---来自studio2005的烦恼
- 成长的烦恼归来
- 《成长的烦恼》介绍
- Apache Solr vs Elasticsearch-feature
- Set、List及Map的基础用法
- 获取服务器微信头像更改不同规格图片大小
- UVa 11389 The Bus Driver Problem
- 通知/代理,
- [bsoj1331] 工厂的烦恼
- Python连接数据库的几种方式
- Mac 下通过 sshfs 挂载远程服务器目录
- HashMap源码分析
- 小博老师解析Java核心技术 ——单例模式的运用
- Solr 6.3.0 入门教程(开篇)Solr特性
- Spring mvc 第一站 初试
- Retrofit+Rxjava2问题小记
- Yii2.0-advanced-10—数据库操作6(读写分离-数据库主从配置)