牛客假日团队赛8 Telephone Lines

 

 

题目的大意就是从1到n的路选择k条将权值设置为0,然后找出最大的权值为花费的价值

二分枚举+ 最短路

ac代码如下

#include <bits/stdc++.h>
 
typedef long long ll;
typedef long long ld;
 
using namespace std;
 
const ll maxn = 1e5 + 7;

ll n,m,k;
struct node
{
	ll x,step;
	node(ll xx,ll ste)
	{
		x = xx;
		step = ste;
	}
};

bool operator < (const node a,const node b)
{
	return a.step > b.step; 
}

struct nod
{
	ll x,y,z;
	nod(ll xx,ll yy,ll zz)
	{
		x = xx;
		y = yy;
		z = zz;
	}
};
vector<nod> mp[maxn];
ll dis[maxn];

void check(ll mid)
{
	for(int i = 1; i <= n; i ++)
	{
		for(int j = 0; j < mp[i].size(); j ++)
		{
			ll val = mp[i][j].y;
			if(mp[i][j].y <= mid)
			{
				mp[i][j].z = 0;
			}
			else
			{
				mp[i][j].z = 1;
			}
		}
	}
}
void dij()
{
	priority_queue<node> q;
	q.push(node(1,0));
	memset(dis,0x3f,sizeof(dis));
	dis[1] = 0;
	bool flag[maxn] = {0};
	while(!q.empty())
	{
		node w = q.top();
		q.pop();
		if(flag[w.x])continue;
		flag[w.x] = 1;
		for(int i = 0; i < mp[w.x].size(); i ++)
		{
			ll to = mp[w.x][i].x;
			ll val = mp[w.x][i].z;
			if(dis[to] > w.step + val && !flag[to])
			{
				dis[to] = w.step + val;
				q.push(node(to,dis[to]));
			} 
		}
	}
	
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	cin >> n >> m >> k;
	ll ma = 0;
	for(int i = 1; i <= m; i ++)
	{
		ll x,y,z;
		cin >> x >> y >> z;
		mp[x].push_back(nod(y,z,0));
		mp[y].push_back(nod(x,z,0));
		ma = max(ma,z);
	}
	
	if(m <= k)
	{
		cout << 0 << endl;
		return 0;
	}
	
	ll l = 0,r = 10000000000,p = -1;
	
	while(l <= r)
	{
		ll mid = (l + r) / 2;
		check(mid);
		dij();
		if(dis[n] <= k)
		{
			r = mid - 1;
			p = mid;
		} 
		else
		{
			l = mid + 1;
		}
	}
	
	cout << p << endl;
	
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值