Coloring Contention
这道题大致意思是Alice和Bob在玩一个游戏,在一个图中,有n个点和m条边,Alice想要让Bob尽可能多的走颜色不同的边,所以她把相邻的边都涂成了,不同的颜色。而Bob要走最少颜色不同的边,问Bob走这个图,最少需要转换多少次颜色。
这仔细一想,就是最短路 - 1,因为走哪条路,都是走一条路换一种颜色,所以Bob就走最短路咯~
为什么要补这个题呢,因为比赛的时候没来得及看,一直在看万恶的E题,至于E题是什么:E题传送门
一是比赛的时候没打,二是想复习一下最短路。
所以代码如下:
用的方法是dijkstra + 堆优化。
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int dist[N];
int e[N], ne[N], w[N], h[N];
bool st[N];
int idx;
int n, m;
typedef pair<int, int> PII;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
int dijkstra()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({1, 0});
while(heap.size())
{
auto t = heap.top();
heap.pop();
int ver = t.first, distance = t.second;
for(int i = h[ver]; i != -1; i = ne[i])
{
int j = e[i];
if(dist[j] > distance + 1)
{
dist[j] = distance + 1;
heap.push({j, dist[j]});
}
}
}
return dist[n];
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for(int i = 0; i < m; i ++)
{
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
int t = dijkstra();
cout << t - 1 << endl;
}