数据太弱???加个剪枝就过了???
正解是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;
}