目前我的程序提交只能得20分,我没发现哪有问题,看了好多博客下面提出的一些测试点也都能跑正确,请发现问题的小伙伴跟我讨论讨论指明一下,谢谢!
思路
按深度优先搜索的思想,用邻接表存储图,然后遍历至尾结点n,将一路上得到的疲劳度加入vector动态数组,最后排序输出第一个。
计算疲劳度思路,通过temp[i]来记录到达 i 节点时的状态,包括当前的总疲劳度、是否是经过小路到达i、如果是经过小路到达i那么连续经过了多少小路,在遍历节点i的下一个节点时就把节点i的状态往下延伸,从而计算得到下一个节点的状态,直到遍历到n结束。
DFS实现代码
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int MAXN = 510;
typedef long long ll;
struct Edge{
ll d;
int v, t;
Edge (int _v,ll _d,int _t):v(_v),d(_d),t(_t){};
};
struct Node{
ll allDis,allEdge;
int flag;
Node(){};
Node (ll _allDis,ll _allEdge,int _flag):allDis(_allDis),allEdge(_allEdge),flag(_flag){};
}temp[MAXN];
vector<Edge> Adj[MAXN];
vector<ll> di;
int n,m;
void DFS(int s){
for(int i = 0;i<Adj[s].size();i++){
int v = Adj[s][i].v;
ll d = Adj[s][i].d;
int t = Adj[s][i].t;
ll new_allEdge;
if(t==1){
temp[v].allEdge = temp[s].allEdge+d;
temp[v].allDis = temp[s].allDis-temp[s].allEdge*temp[s].allEdge+temp[v].allEdge*temp[v].allEdge;
temp[v].flag = 1;
}else{
temp[v].allDis = temp[s].allDis+d;
temp[v].flag = 0;
temp[v].allEdge = 0;
}
if(v==n){
di.push_back(temp[v].allDis);
continue;
}
DFS(v);
}
}
int main(){
int t,a,b;
ll c;
scanf("%d%d",&n,&m);
for(int i = 0;i<m;i++){
scanf("%d%d%d%lld",&t,&a,&b,&c);
Adj[a].push_back(Edge(b,c,t));
}
temp[1].allDis = 0;
temp[1].allEdge = 0;
temp[1].flag = 0;
DFS(1);
sort(di.begin(),di.end());
printf("%lld",di.front());
return 0;
}
运行样例截图
这是我把运行样例的每一条路径所消耗的疲劳度都打印出来了。(按理输出第一个就行)
BFS实现代码
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int MAXN = 510;
typedef long long ll;
struct Edge{
ll d;
int v, t;
Edge (int _v,ll _d,int _t):v(_v),d(_d),t(_t){};
};
struct Node{
ll allDis,allEdge;
int flag;
Node(){};
Node (ll _allDis,ll _allEdge,int _flag):allDis(_allDis),allEdge(_allEdge),flag(_flag){};
};
vector<Node> dp[3];
vector<Edge> Adj[MAXN];
vector<Edge> Adj1[MAXN];
vector<ll> di;
int n,m;
ll minDis = 1e18;
int tl;
void BFS(int s){
int t2 = 1-tl;
if(Adj1[s].size()==0&&s!=n) return;
for(int j = 0;j<dp[tl].size();j++){
Node ans = dp[tl][j],temp;
for(int i = 0;i<Adj[s].size();i++){
int v = Adj[s][i].v;
ll d = Adj[s][i].d;
int t = Adj[s][i].t;
if(t==1){
temp.allEdge = ans.allEdge+d;
temp.allDis = ans.allDis-ans.allEdge*ans.allEdge+temp.allEdge*temp.allEdge;
temp.flag = 1;
}else{
temp.allDis = ans.allDis+d;
temp.flag = 0;
temp.allEdge = 0;
}
if(v==1){
di.push_back(temp.allDis);
continue;
}else dp[t2].push_back(temp);
}
}
dp[tl].clear();
tl = t2;
}
int main(){
int t,a,b;
ll c;
scanf("%d%d",&n,&m);
for(int i = 0;i<m;i++){
scanf("%d%d%d%lld",&t,&a,&b,&c);
Adj[b].push_back(Edge(a,c,t));
Adj1[a].push_back(Edge(b,c,t));
}
dp[tl].push_back(Node(0,0,0));
for(int i = n;i>=1;i--){
BFS(i);
}
sort(di.begin(),di.end());
printf("%lld",di.front());
return 0;
}
``