hdu 1142 dijkstra+dfs A Walk Through the Forest

源地址:http://acm.hdu.edu.cn/showproblem.php?pid=1142

题目大意:起点1,终点2,A与B想邻,如果B到终点的距离小于A到终点的距离,则A到B算一种走法(感觉解释的很烂,还是自已去看原题吧)

思想:求出所有点到2点的距离,用dijkstra,没有什么特别的,接着dfs,从1点开始,对1 点相邻的点并且距离比他短的进行深搜,返回路径数

/*最短路+dfs*/
/*使用了不常用的vector,queue,有错误提醒下*/
#include<iostream>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 1010
#define INF 1000010010
struct mice{
    int x,dis;
};
int dis[MAXN],vis[MAXN],map[MAXN][MAXN],kind[MAXN];
typedef pair< int ,int >pii;
vector < mice > pnt[MAXN];
priority_queue<pii,vector<pii>,greater<pii>  >q;
int n,m;
void dij()//dijkstra求最短路
{
    int i,j;
    dis[2]=0;
    q.push(make_pair(0,2));
    while(!q.empty())
    {
        pii tt=q.top();
        q.pop();
        int v=tt.second;
        if(vis[v])
            continue;
        vis[v]=1;
        int s=pnt[v].size();
        for(i=0;i<s;i++)
        {
            int x,len;
            x=pnt[v].at(i).x;len=pnt[v].at(i).dis;
            if(vis[x]==0)
            {
                if(dis[x]>dis[v]+len)
                {
                    dis[x]=dis[v]+len;
                    q.push(make_pair(dis[x],x));
                }
            }
        }
    }
}
void init()//初始化
{
    for(int i=0;i<=n;i++)
    {
        dis[i]=INF;
        vis[i]=0;
        kind[i]=-1;
        pnt[i].clear();
    }
}
int dfs(int x)
{
    if(kind[x]!=-1)
        return kind[x];
    int i,j;
    int len;
    int s=pnt[x].size();
    int sum=0,y;
    for(i=0;i<s;i++)
    {
        y=pnt[x].at(i).x;
        if(y==2)
        {
            sum++;
            continue;
        }
        if(dis[y]<dis[x])
            sum+=dfs(y);
    }
    kind[x]=sum;//用kind记录路径数,避免重复搜索
    return sum;
}

int main()
{
    int i,j,k,x,y,z;
    while(cin>>n,n)
    {
        cin>>m;
        init();
        for(i=0;i<m;i++)
        {
            cin>>x>>y>>z;
            mice tt;
            tt.x=y;tt.dis=z;
            pnt[x].push_back(tt);//用vector实现与邻接表一样的功能
            tt.x=x;
            pnt[y].push_back(tt);
        }
        dij();
        int sum=dfs(1);
        cout<<sum<<endl;
    }
}

                                    学习交流邮箱:810278677@qq.com

posted @ 2012-07-18 15:10  炎色  阅读(227)  评论(0编辑  收藏  举报