洛谷P3116 USACO15JAN Meeting time - 搜索 - 剪枝

数据太弱???加个剪枝就过了???
正解是DP。。。回来我会填坑的
PS:wa了无数遍后,我发现自己的dfs写错了。。。。。
原因看注释吧

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 100 + 10;
const int MAXM = MAXN * 2;
int n,m,pat1[1000000], pat2[1000000],num1,num2,ans=1<<30,last[MAXN],tot,dis1[MAXN],dis2[MAXN];
queue <int> q;
struct Edge{
    int u,v,w1,w2,to;
    Edge(){}
    Edge(int u, int v, int w1, int w2, int to) : u(u), v(v), w1(w1), w2(w2), to(to) {}
}e[50100];
inline void add(int u, int v, int w1, int w2) {
    e[++tot] = Edge(u, v, w1, w2, last[u]);
    last[u] = tot;
}
void dfs(int x) {
    for(int i=last[x]; i; i=e[i].to) {
        int v = e[i].v;
        int w1 = e[i].w1;
        int w2 = e[i].w2;
        dis1[v] = dis1[x] + w1;
        dis2[v] = dis2[x] + w2;
        if(dis1[v] >= ans && dis2[v] >= ans) continue; // 这里一开始写成return,现在是x的递归层,就算v不能再递归下去,也不能在x层返回,这样的话x的其他子节点就扫不到了
        if(v == n) {
            bool flg1=true, flg2=true;
            for(int k=1; k<=num1; k++) {
                if(pat1[k] == dis1[v]) flg1 = false;
            }
            for(int k=1; k<=num2; k++) {
                if(pat2[k] == dis2[v]) flg2 = false;
            }
            if(flg1) pat1[++num1] = dis1[v];
            if(flg2) pat2[++num2] = dis2[v];
            for(int k=1; k<=num2; k++) {
                if(dis1[v] == pat2[k]) ans = min(ans, pat2[k]);
            }
            for(int k=1; k<=num1; k++) {
                if(dis2[v] == pat1[k]) ans = min(ans, pat1[k]);
            }
            continue;//这里我也写成return了。。。
        }
       dfs(v);
    }
}
int main() {
    cin >> n >> m;
    for(int i=1; i<=m; i++) {
        int u,v,w1,w2;
        cin >> u >> v >> w1 >> w2;
        add(u, v, w1, w2);
    }
    dfs(1);
    if(ans == 1<<30) {
        cout << "IMPOSSIBLE";
        return 0;
    }
    cout << ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Fantasy_World/article/details/81200932
今日推荐