HDU-3768-Shopping(spfa+dfs)

来源:互联网 发布:ditto软件 编辑:程序博客网 时间:2024/05/29 18:20

题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=3768

题意:给一个无向图,起点为0,从起点开始要走s个点再回到起点的最短路。

由于s<=10,可以先记录从一个点到另一个点的最短路径,然后在暴力枚举从0开始走这s个点的顺序。


最短路详见博客:http://blog.csdn.net/newproblems/article/details/76472749


AC代码

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <string>#include <vector>#include <cmath>#include <queue>#include <stack>#include <map>#define inf 0x3f3f3f3f#define maxa 100010using namespace std;int n,m,s,dis[20][maxa],book[maxa],a[maxa];struct node{    int y,d;    node (int _y,int _d)    {        y=_y,d=_d;    }};vector < node > p[maxa] ;void add(int x,int y,int d){    p[x].push_back(node(y,d));}void spfa(int st){    memset(dis[st],inf,sizeof(dis[st]));    memset(book,0,sizeof(book));    dis[st][a[st]]=0;    book[a[st]]=1;    queue<int> que;    que.push(a[st]);    while(!que.empty())    {        int ss=que.front();        que.pop();        book[ss]=0;        int l=p[ss].size();        for(int i=0; i<l; i++)        {            int v=p[ss][i].y,w=p[ss][i].d;            if(dis[st][v]>dis[st][ss]+w)            {                dis[st][v]=dis[st][ss]+w;                if(!book[v])                {                    que.push(v);                    book[v]=1;                }            }        }    }}int sum;void dfs(int x,int y,int t){    if(t==s)    {        sum=min(sum,y+dis[x][0]);        return ;    }    for(int i=1; i<=s; i++)        if(book[a[i]]==0)        {            book[a[i]]=1;            dfs(i,y+dis[x][a[i]],t+1);            book[a[i]]=0;        }}int main(){    int T;    cin >> T;    while(T--)    {        scanf("%d %d",&n,&m);        for(int i=0;i<n;i++)            p[i].clear();//清空vector        while(m--)        {            int x,y,d;            scanf("%d %d %d",&x,&y,&d);            add(x,y,d);            add(y,x,d);        }        spfa(0);        scanf("%d",&s);        for(int i=1; i<=s; i++)        {            scanf("%d",&a[i]);            spfa(i);        }        sum=inf;        memset(book,0,sizeof(book));        dfs(0,0,0);        printf("%d\n",sum);    }    return 0;}



原创粉丝点击