pat 1030

来源:互联网 发布:家里穷不敢谈恋爱 知乎 编辑:程序博客网 时间:2024/06/03 13:20

df+回溯

#include<stdio.h>#include<stdlib.h>#include<vector>#include<string.h>using namespace std;int n,m,s,d,mindist,mincost,sum_dist,sum_cost;int mat[505][505];int cost[505][505];int vis[505];vector<int> v,res;void dfs(int x){    if(x==d){        if(mindist>sum_dist){            mindist=sum_dist;            mincost=sum_cost;            res.clear();            for(int j=0;j<v.size();j++)                res.push_back(v[j]);        }else if(mindist==sum_dist){            if(mincost>sum_cost){                mincost=sum_cost;                res.clear();                for(int j=0;j<v.size();j++)                    res.push_back(v[j]);            }        }        return;    }    for(int i=0;i<n;i++){        if(vis[i]==0&&mat[x][i]!=-1){            sum_dist+=mat[x][i];            sum_cost+=cost[x][i];            vis[i]=1;            v.push_back(i);            dfs(i);            v.pop_back();            vis[i]=0;            sum_cost-=cost[x][i];            sum_dist-=mat[x][i];        }    }}int main(){    scanf("%d%d%d%d",&n,&m,&s,&d);    memset(mat,-1,sizeof(mat));    memset(vis,0,sizeof(vis));    int a,b,c,d;    for(int i=0;i<m;i++){        scanf("%d%d%d%d",&a,&b,&c,&d);        mat[a][b]=mat[b][a]=c;        cost[a][b]=cost[b][a]=d;    }    vis[s]=1;    mindist=0x7fffffff;    mincost=0x7fffffff;    sum_dist=0;    sum_cost=0;    v.push_back(s);    dfs(s);    for(int i=0;i<res.size();i++){        if(i==0)            printf("%d",res[i]);        else            printf(" %d",res[i]);    }    printf(" %d %d",mindist,mincost);    //system("pause");    return 0;}