Egor in the Republic of Dagestan
题目大意
给一张有向图,边的边权只有0和1,让给点染色,点是0的点只能走边权是0 的边,点是1的点只能走边权是1的边,
有一个人要从1走到n,让给点染色,使这个人走不到n,如果不能让他走不到n,那就让他走的最短路距离最大。
输出最短路的距离和点权。
题解
目的是要把每个点走到n的最短路给封住,
建反向图,从n开始走,如果这是第一次走到点x,就把x的颜色变成跟这个边的颜色不同的颜色,因为第一次走到是最短距离,把这个最短距离封住就好。然后其他的就是最短路了。
为什么要倒着呢?因为这个点的颜色是根据下一个边定的。
#include<algorithm>
#include<iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <unordered_set>
#include <climits>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef unsigned long long ull;
typedef unordered_set<int>::iterator sit;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
void tempwj