题目大意:
给定一个图,有三种颜色的边,求出从
1
到
分析:
就是最短路,不说什么…
AC code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define mp std::make_pair
#define ONLINE_JUDGE
const int MAXN = 209, MAXM = 40009;
const int INF = 0x3f3f3f3f;
int n, m;
struct Dgraph
{
int size;
int head[MAXN];
int to[MAXM];
int col[MAXM];
int ne[MAXM];
Dgraph(){size = 1;}
void add_edge(int u, int v, int c)
{
to[size] = v, col[size] = c, ne[size] = head[u], head[u] = size++;
}
}G;
int dis[MAXN][3];
int in[MAXN][3];
void spfa()
{
std::queue< std::pair<int,int> > q;
memset(dis, INF, sizeof(dis));
q.push(mp(1, 0)), q.push(mp(1, 1)), q.push(mp(1, 2));
in[1][0] = in[1][1] = in[1][2] = 1;
dis[1][0] = dis[1][1] = dis[1][2] = 0;
while(!q.empty())
{
std::pair<int,int> now = q.front();q.pop();
int u = now.first, col = now.second;
in[u][col] = 0;
for(int i = G.head[u]; i; i = G.ne[i])
if(G.col[i] != col)
{
int v = G.to[i];
if(dis[v][G.col[i]] > dis[u][col]+1)
{
dis[v][G.col[i]] = dis[u][col]+1;
if(!in[v][G.col[i]])
{
in[v][G.col[i]] = 1;
q.push(mp(v, G.col[i]));
}
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("sgu226.in", "r", stdin);
freopen("sgu226.out", "w", stdout);
#endif
std::ios::sync_with_stdio(0);
std::cin >> n >> m;
for(int i = 1; i <= m; ++i)
{
int u, v, c;
std::cin >> u >> v >> c;
G.add_edge(u, v, c-1);
}
spfa();
if(dis[n][0] == INF && dis[n][1] == INF && dis[n][2] == INF) puts("-1");
else std::cout << std::min(std::min(dis[n][0], dis[n][1]), dis[n][2]) << std::endl;
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}