Coloring Contention

传送门

题意:

给你n个点m条边,Alice会给每条边加颜色使Bob走的路径的颜色变换尽可能大,Bob则需要找一条路径使颜色变换尽可能小

 颜色变换:点俩边的边颜色不同。 

思路:因为Alice想让颜色变换最大,所以让路径颜色交叉Bob想让颜色变换尽可能小,所以肯肯定走最短路径
所以答案是1到n的最短路径-1
注意:开数组的时候,因为是无向图,所以开2倍 

这个题就是dijkstra的模板题:

code:

/*
因为Alice想让颜色变换最大,所以让路径颜色交叉
Bob想让颜色变换尽可能小,所以肯肯定走最短路径
所以答案是1到n的最短路径-1
注意:开数组的时候,因为是无向图,所以开2倍 
*/ 
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#define PII pair<int,int>
#define INF 0x3f3f3f3f

using namespace std;

const int N=1e5+10;
int dis[N];
bool st[N];
int cnt;
int head[N],ne[2*N],e[2*N];

void add(int u,int v){
	e[cnt]=v;ne[cnt]=head[u];head[u]=cnt++;
}

void dijkstra(){
	memset(dis,INF,sizeof(dis));
	priority_queue<PII,vector<PII>,greater<PII> > heap;
	heap.push({0,1});
	dis[1]=0;
	while(heap.size()){
		auto t=heap.top();
		heap.pop();
		int ver=t.second,distance=t.first;
		if(st[ver]) continue;
		st[ver]=1;
		for(int i=head[ver];i!=-1;i=ne[i]){
			int j=e[i];
			if(dis[j]>distance+1){
				dis[j]=distance+1;
				heap.push({dis[j],j});
			}
		}
	}
	
}

int main()
{
	memset(head,-1,sizeof(head));
	int n,m;
	scanf("%d%d",&n,&m); 
	int a,b;
	while(m--){
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	dijkstra();
	printf("%d\n",dis[n]-1);
	 	
	return 0;
 } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值