题目链接 Coloring Contention
这个题,没看明白,后来才知道是最短路的变形。。
思路: 因为Alice 想要Bob走变换次数最多的路,那么她之间将所有相邻的路都图成不同颜色,在这种情况下,Bob只需要走图中的最短路即可,那么变换颜色的次数就是
最短路 - 1 。
求最短路的意图明确了,但是数据给的1e5的数量,正常的邻接图内存会爆掉,所以需要链式存储,同时只有用spfa或者Dijkstra的栈堆优化才能不tle,这里我使用了spfa的算法,至于Dijkstra的优化算法,有时间学习后再更
ac代码
#include <iostream>
#include <string.h>
#include <queue>
#define MAXM 100005
#define MAXN 100005
#define INF 9999999
using namespace std;
typedef struct {
int to;
int v;
int next;
}Edge;
Edge edge[MAXM * 2];
int vis[MAXN],head[MAXN],dis[MAXN],cnt;
void addedge(int a,int b,int c){
cnt++;
edge[cnt].next = head[a];
edge[cnt].to = b;
edge[cnt].v = c;
head[a] = cnt;
}
int spfa(int start,int n){
for(int i = 1; i <= n; i++){
dis[i] = INF;
}
dis[start] = 0;
queue <int> q;
q.push(start);
vis[start] = 1;
while(!q.empty()){
int temp = q.front();
q.pop();
vis[temp] = 0;
for(int i = head[temp]; i; i = edge[i].next){
if(dis[edge[i].to] > dis[temp] + edge[i].v){
dis[edge[i].to] = dis[temp] + edge[i].v;
if(!vis[edge[i].to]){
q.push(edge[i].to);
vis[edge[i].to] = 1;
}
}
}
}
return dis[n];
}
int main(){
int n,m;
cin>>n>>m;
int a,b,c;
cnt = 0;
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
for(int i = 1; i <= m; i++){
cin>>a>>b;
addedge(a,b,1);
addedge(b,a,1);
}
int start = 1;
int ans = spfa(start,n);
cout<<ans - 1<<endl;
return 0;
}