现在的位置: 首页 > 综合 > 正文

ZOJ 3620 Escape Time II

2018年04月21日 ⁄ 综合 ⁄ 共 1096字 ⁄ 字号 评论关闭

多种写法。渣渣只会dfs

#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
#define INF 99999999
int const MAXN = 20;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int va[MAXN],va1[MAXN],maze[MAXN][MAXN],vis[MAXN];
int n,m,t,ans;
int s,e;
inline int Max(int a,int b){
    return a>b?a:b;
}
inline int Min(int a,int b){
    return a<b?a:b;
}
void Dfs(int st,int step,int vl){
    if(st == e && step <= t){
        ans = Max(ans,vl);
        return ;
    }
    for(int i = 0;i < n;i++){
        if(maze[st][i] == INF || vis[i]) continue;
        if(step + maze[st][i] > t) continue;
        vis[i] = 1;
        Dfs(i,step + maze[st][i],vl + va[i]);
        vis[i] = 0;
    }
    return ;
}
void Init(){
    for(int i = 0;i < MAXN;i++){
        for(int j = 0;j < MAXN;j++){
            maze[i][j] = INF;
        }
    }
    memset(vis,0,sizeof(vis));
    memset(va,0,sizeof(va));
    ans = -1;
}
int main(){
    while(~scanf("%d%d%d",&n,&m,&t)){
        Init();
        scanf("%d%d",&s,&e);
        for(int i = 0;i < n;i++){
            scanf("%d",&va[i]);
        }
        for(int i = 0;i < m;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            maze[a][b] = maze[b][a] = Min(maze[b][a],c);
        }
        for(int k = 0;k < n;k++){
            for(int i = 0;i < n;i++){
                for(int j = 0;j < n;j++){
                    maze[i][j] = Min(maze[i][j],maze[i][k] + maze[k][j]);
                }
            }
        }
        int vl = va[s];
        va[s] = 0;
        Dfs(s,0,vl);
        if(ans == -1)printf("0\n");
        else printf("%d\n",ans);
    }
    return 0;
}
/*
3 3 5
0 1
0 1 1
0 1 1
1 2 2
0 2 10

*/

抱歉!评论已关闭.