【次小生成树】4.秘密的牛奶运输

题目描述

Farmer John 要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。

运输的总距离越小,运输的成本也就越低。
Farmer John 期望低成本的运输,但他并不想让他的竞争对手知道他具体的运输方案,
所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。

输入格式
第一行是两个整数 N,M,表示顶点数和边数;

接下来 M 行每行 3 个整数,x,y,z,表示一条路的两端 x,y 和距离 z。

输出格式
仅一行,输出第二小方案。

样例
输入数据 1

4 4
1 2 100
2 4 200
2 3 250
3 4 100

输出数据 1

450

1  ---100---  2
                  /  \ 
             250   200
                /      \
            3 -100 - 4

数据范围与提示
对于全部数据,1<=N<=500 , 1<=M <=10^4 ,1<=z<=10^9 ,
数据可能有重边。

分析:

#include
using namespace std;
typedef long long ll;
const int N=510,M=1e4+10;
int n,m;
int p[N];
int dist1[N][N],dist2[N][N];//最大距离和次大距离 
int head[N],e[N*2],w[N*2],ne[N*2],index;

struct Arcnode //边的类型 
{
	int x,y,z;
	bool flag=false;
	bool operator<(const edge &e)const
	{
		return zu的最大边权值 d2[u]保存从now->的次大边权值 
//循环遍历与u连接的每一个点v,如果没有回到终点fa就继续 
void dfs(int start,int end,int maxd1,int maxd2,int d1[],int d2)
{
	d1[start]=maxd1;
	d2[start]=maxd2;
	for(int i=head[start] ; ~i ;i=ne[i])
	{
		int j=e[i];//存弧头 终点 
		if(j!=end)
		{
			int td1=maxd1;
			int td2=maxd2;
			if(w[i]>td1)//i权值 大于 最大距离 
				td2=td1,td1=w[i];//次大距离=最大距离,最大距离=i权值 
			else if(w[i]>td2 &&w[i]dist1[x][y])//这条边的权值> x->y的最大距离 
				temp=sum+w-dist1[a][b];
			else if(z>dist2[x][y])
				temp=sum+w-dist2[a][b];
			res=min(res,temp);//最小值 
		} 
	}
	printf("%lld\n",res);

	return 0;
}

你可能感兴趣的:(算法题,蓝桥杯,职场和发展)