HDOJ_1142 最短路 迪杰斯特拉+广搜

本题的基本思路是想地杰斯特拉找出最短路,然后用广搜找出有多少个路

这个题很让人崩溃,刚开始一直runtime error 搞得我一头雾水,高了半天,我map初始化的语句该做条件表达式就过了,不解

今天大奔又弄个runtime error 问我类,我昨天在自己的电脑上交了,回头他交不了,我愣了愣,后来才发现得用c++提交,依然无解

#include<stdio.h>
#include<string.h>
#define MAX 1000010
//#define MAX_1 1001
int map[1001][1001],dis[1001];
int res[1001];
int n,m;
bool visit[1001];

void dijkstra(int k)
{
    int u,i,j,min,x;
    for(i=1;i<=n;++i)
    {
        visit[i]=false;
        dis[i]=map[2][i];
    }
    visit[2]=true;
    if(min==MAX)
    return ;
    for(i=2;i<=n;++i)
    {
        min=MAX;
        for(j=1;j<=n;++j)
        {
            if(!visit[j]&&min>dis[j])
            {
                u=j;
                min=dis[j];
            }
        }
        visit[u]=true;
        for(x=1;x<=n;++x)
        {
            if(!visit[x]&&dis[x]>dis[u]+map[x][u])
            {
                dis[x]=dis[u]+map[x][u];
            }
        }
    }
}
int find(int v)
{
    int i;
    if(res[v]!=-1)
        return res[v];
    if(v==2)
        return 1;
    res[v]=0;
    for(i=1;i<=n;++i)
    {
        if(map[i][v]!=MAX && dis[i]<dis[v])
            res[v]+=find(i);
    }
    return res[v];
}


int main()
{
    int i,j,a,b,value;
    while(scanf("%d",&n)!=EOF&&n)
    {
        scanf("%d",&m);
        for(i=1;i<=n;++i)
            for(j=1;j<=n;++j)
            {
                map[i][j]=MAX;
             map[i][j] = i == j ? 0 : MAX; 
            }
        for(i=1;i<=m;++i)
        {
            scanf("%d%d%d",&a,&b,&value);
            map[a][b]=map[b][a]=value;
        }
        dijkstra(2);
        memset(res,-1,sizeof(res));
        printf("%d\n",find(1));
    }
    return 0;
}

 

 

posted @ 2012-08-22 09:16  煮人为乐  阅读(305)  评论(0编辑  收藏  举报