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");
}
else
printf("%lld\n", ans + 888 * n);
}
return 0;
}