浙大PAT甲级-1003

来源:互联网 发布:杰视帮美工教程 编辑:程序博客网 时间:2024/05/16 06:25

第一次着手解决这类题,感觉思想很简单,但却无从下手,主要参考这篇博客(http://blog.csdn.net/iaccepted/article/details/21451949)写的

值得学习的地方:

-图用一个二维数组存储

-dfs函数的大概模式(判断是否到末节点,剪枝,递归调用......)

#include <iostream>#include <climits>using namespace std;const int MAX=501;int v,teams[MAX],visit[MAX], map[MAX][MAX];int cnt=0;int maxt=0;int minl=INT_MAX;void init(int n){    for(int i=0;i<n;i++){        visit[i]=0;        for(int j=0;j<n;j++)        map[i][j]=INT_MAX;    }}void dfs(int s,int e,int team,int len){    if(s==e){        if(len<minl){            minl=len;            cnt=1;            maxt=team;        }else if(len==minl){            cnt++;            if(maxt<team)                maxt=team;        }        return;    }    //剪枝    if(len>minl)return;    for(int i=0;i<v;i++){        if(visit[i]==0&&map[s][i]<INT_MAX){            visit[i]=1;            dfs(i,e,team+teams[i],len+map[s][i]);            visit[i]=0;        }    }}int main(){    int e,start,end;    cin>>v>>e>>start>>end;    for(int i=0;i<v;i++)        cin>>teams[i];    init(v);    int v1,v2,l;    int m=e;    while(m--){        cin>>v1>>v2>>l;        if(map[v1][v2]>l)            map[v1][v2]=map[v2][v1]=l;    }    dfs(start,end,teams[start],0);    cout<<cnt<<" "<<maxt;    return 0;}