http://acm.hdu.edu.cn/showproblem.php?pid=1010
【题意】
问是否可能 S->D使用恰好为T的时间
【思路】
偶数点到偶数点(坐标xy之和)需要走偶数次,奇数到奇数也要走偶数次。
【代码】
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const ll maxv = 1e4 + 4;ll n, m, vis[maxv], ans, in[maxv];
vector<ll>v[maxv];struct node
{ll x, layer;
};void init()
{ans = 0;for (ll i = 0; i <= n; i++){v[i].clear();vis[i] = 0;in[i] = 0;}
}ll top()
{node tmp;queue<node>q;ll num = 0;for (ll i = 1; i <= n; i++){if (in[i] == 0){tmp.layer = 0;tmp.x = i;q.push(tmp);}}while (!q.empty()){node now = q.front();q.pop();ans += now.layer;ll u = now.x;for (ll i = 0; i < v[u].size(); i++){ll to = v[u][i];in[to]--;if (in[to] == 0){tmp.x = to;tmp.layer = now.layer + 1;q.push(tmp);}}num++;}if (num != n)return -1;return 1;
}int main()
{std::ios::sync_with_stdio(false);while (scanf("%lld %lld", &n, &m) != EOF){init();for (ll i = 1; i <= m; i++){ll a, b;scanf("%lld %lld", &a, &b);v[b].push_back(a);in[a]++;}ll key = top();if (key == -1){printf("-1\n");}elseprintf("%lld\n", ans + 888 * n);}return 0;
}