LightOJ

来源:互联网 发布:z3735 ubuntu 编辑:程序博客网 时间:2024/06/07 02:40

这题判负环后需要用dfs把整个负环标记一下,WA到爆炸的同学尝试把I64改成ll或者直接用int

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 250;bool vis[maxn], judge[maxn];int T, N, M, Q, busyness[maxn], tot, head[maxn], num[maxn], dis[maxn];struct Edge {    int to, val, next;}edge[maxn * maxn];int cal(int x, int y) { return (x - y) * (x - y) * (x - y); }void init() {    tot = 0;    for (int i = 1; i <= N; i++) head[i] = -1, judge[i] = false;}void addedge(int u, int v, int val) {    tot++;    edge[tot].to = v;    edge[tot].val = val;    edge[tot].next = head[u];    head[u] = tot;}void dfs(int u) {    if (judge[u]) return;    judge[u] = true;    for (int i = head[u]; i != -1; i = edge[i].next) {        int v = edge[i].to;        dfs(v);    }}void spfa(int s) {    for (int i = 1; i <= N; i++) dis[i] = INF, vis[i] = false, num[i] = 0;    dis[s] = 0, vis[s] = true, num[s] = 1;    queue<int> q; q.push(s);    while (!q.empty()) {        int u = q.front(); q.pop();        vis[u] = false;        for (int i = head[u]; i != -1; i = edge[i].next) {            int v = edge[i].to, val = edge[i].val;            if (dis[v] > dis[u] + val) {                dis[v] = dis[u] + val;                if(!vis[v]) {                    vis[v] = true; num[v]++;                    q.push(v);                    if (num[v] >= N) {                        dfs(v);                        return;                    }                }            }        }    }}int main() {    scanf("%d", &T);    for (int kase = 1; kase <= T; kase++) {        scanf("%d", &N);        init();        for (int i = 1; i <= N; i++) scanf("%d", &busyness[i]);        scanf("%d", &M);        for (int i = 1; i <= M; i++) {            int u, v; scanf("%d %d", &u, &v);            int val =cal(busyness[v], busyness[u]);            addedge(u, v, val);        }        spfa(1);        printf("Case %d:\n", kase);        scanf("%d", &Q);        for (int i = 1; i <= Q; i++) {            int temp; scanf("%d", &temp);            if (judge[temp] || dis[temp] == INF || dis[temp] < 3) {                printf("?\n");            }            else {                printf("%d\n", dis[temp]);            }        }    }    return 0;}