工厂的烦恼 题解

工厂的烦恼

题目

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


输入

第一行是两个整数NNMMNN<=100,MM<=1000),分别表示网络的结点个数和弧数。第二行至MM+1行,每行三个整数AABBCC,表示弧上的损耗为CC


输出

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


样例

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

output
17


解题思路

板子题呀
SPFA改成求最长距离


代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,x,y,s,h,t,maxn;
int p[12000],f[12000],dis[12000],head[12000];
struct c{
	int q,to,next;
}a[12000];
void spf(int x)
{
	memset(p,0,sizeof(p));
	memset(f,0,sizeof(f));
	memset(dis,0,sizeof(dis));
    h=0;
    t=1;
	p[x]=1;
	f[1]=x;
	dis[x]=0;
	do{
		h++;
		for (int j=head[f[h]];j;j=a[j].next)
		    if (dis[f[h]]+a[j].q>dis[a[j].to])
		    {
		    	dis[a[j].to]=dis[f[h]]+a[j].q;
		    	if (p[a[j].to]==0)
		    	{
		    		p[a[j].to]=1;
		    		t++;
		    		f[t]=a[j].to;
		    	}
		    }
		p[f[h]]=0;
	}while(h<t);
}
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&s);
		a[i].q=s;
		a[i].to=y;
		a[i].next=head[x];
		head[x]=i;  //构建邻接表,有向图
	}
	for (int i=1;i<=n;i++)  //枚举起点
	{
		spf(i);  //板子
		int ans=0;
		for (int j=1;j<=n;j++)
		    maxn=max(maxn,dis[j]);  //终点不定求最大
	}
	cout<<maxn;
}
发布了34 篇原创文章 · 获赞 7 · 访问量 647
展开阅读全文

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

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览