社区讨论

求助,WA60

P3106[USACO14OPEN] Dueling GPSs S参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7ri5hq
此快照首次捕获于
2025/11/21 02:25
4 个月前
此快照最后确认于
2025/11/21 02:25
4 个月前
查看原帖
样例都没有过,输出2......
我建的确实是有向图......
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

#define SIZE 100010

using namespace std;

struct node
{
    int to, dis[3];
};

vector<node> graph[SIZE];
int id[SIZE], dis[SIZE], pre[SIZE], n;
bool inqueue[SIZE];

int spfa(int x)
{
    queue<int> q;
    int u, v, w, i;
    
    q.push(1);
    memset(dis, 63, sizeof (dis));
    dis[1] = 0;
    while (!q.empty())
    {
        u = q.front();
        q.pop();
        inqueue[u] = false;
        for (i = 0; i < graph[u].size(); ++i)
        {
            v = graph[u][i].to;
            w = graph[u][i].dis[x];
            if (dis[u] + w < dis[v])
            {
                // printf("^%d %d\n", u, v);
                dis[v] = dis[u] + w;
                id[v] = i;
                pre[v] = u;
                if (!inqueue[v])
                {
                    inqueue[v] = true;
                    q.push(v);
                }
            }
        }
    }
    for (int k = 1; k <= n; ++k)
    {
        // printf("%d ", dis[k]);
    }
    // printf("###\n");
    
    return dis[n];
}

void doit(void)
{
    int u = n;
    
    while (u != 1)
    {
        // printf("& %d %d\n", u, pre[u]);
        --graph[pre[u]][id[u]].dis[2];
        u = pre[u];
    }
    
    return;
}

int main(void)
{
    int m, u, v, p, q;
    
    scanf("%d%d", &n, &m);
    while (m--)
    {
        scanf("%d%d%d%d", &u, &v, &p, &q);
        graph[u].push_back({v, {p, q, 2}});
    }
    
    spfa(0);
    doit();
    spfa(1);
    doit();
    
    printf("%d", spfa(2));
    
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...