着色の競合
この質問は、アリスとボブがゲームをプレイしていることを大まかに意味します。グラフには、n個のポイントとm個のエッジがあります。アリスは、ボブにできるだけ多くの異なる色のエッジを取得してもらいたいので、隣接するエッジを配置します。異なる色。そして、ボブは色の違いが最も少ない側を歩き、この写真を撮るときに少なくとも何色を変更する必要があるかをボブに尋ねる必要があります。
よく考えてみると、最短経路です-1。どちらの道を行くかは、ある経路から別の経路に色を変えることなので、ボブが最短経路を取ります〜
なぜこの質問を作りたいのですか?邪悪な質問Eを見ています。質問Eとは:質問Eポータル
1つはゲームにヒットしなかったということで、もう1つは最短経路を確認したいということです。
したがって、コードは次のとおりです
。使用される方法は、ダイクストラ+ヒープ最適化です。
#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;
}