HDU 1142

這道題在最短路方面沒什麼問題,主要是最後求出每一點到終點的最短路之後要使用記憶化搜索來尋找可以行走的路數

不多說直接上代碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 10000000//坑爹啊,這題的難點原來是記憶化搜索!!!!我還以爲不能用Dijkstra要用SPFA。。。。。。。。。
using namespace std;
int dis[1005],cost[1005][1005],judge[1005];
int sum[1005];
int n,m;
void Dijkstra()
{
    fill(dis,dis+n+1,INF);
    memset(judge,0,sizeof(judge));
    dis[2]=0;
    int x;
    while(true)
    {
        x=-1;
        for(int i=1;i<=n;i++)
        {
            if(judge[i]==0&&(x==-1||dis[i]<dis[x])) x=i;
        }
        if(x==-1) break;
        judge[x]=1;
        for(int i=1;i<=n;i++)
        {
            dis[i]=min(dis[i],dis[x]+cost[x][i]);
        }
    }
    return;
}
int dfs(int x)
{
    if(sum[x]!=0) return sum[x];
    if(x==2) return 1;
    for(int i=1;i<=n;i++)
    {
        if(dis[x]>dis[i]&&cost[i][x]!=INF)
        {
            sum[x]+=dfs(i);
        }
    }
    return sum[x];
}
int main()
{
    int point1,point2,value,ans;
    while(scanf("%d",&n)!=EOF&&n)
    {
        scanf("%d",&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++) cost[i][j]=INF;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&point1,&point2,&value);
            cost[point1][point2]=cost[point2][point1]=value;
        }
        Dijkstra();
        memset(sum,0,sizeof(sum));
        ans=dfs(1);
        printf("%d\n",ans);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章