1010 problem J

题意:
大概就是从A到B最短的距离确定,但是有几条路不确定,让你求有几条最短路。
思路:
求出最短路保存起来,遍历一遍数一下

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXN 1005
int cost[MAXN][MAXN];
int dis[MAXN];
int sum[MAXN];
#define INF 0x3f3f3f3f  
#define typec int  
int path[MAXN],vis[MAXN];
void Dijkstra(typec cost[][MAXN],typec lowcost[MAXN],int n,int beg)
{
    int i,j;
    typec minc;
    memset(vis,0,sizeof(vis));
    vis[beg]=1;
    for(i=1;i<=n;i++)
    {
        lowcost[i]=cost[beg][i];path[i]=beg;
    }
    lowcost[beg]=0;
    path[beg]=-1;
    int pre;
    for(int num=2;num<n;num++)
    {
        minc=INF;
        for(j=1;j<=n;j++)
           if(vis[j]==0&&lowcost[j]<minc)
           {pre=j;minc=lowcost[j];}
        if(minc>=INF)break;
        vis[pre]=1;
        for(j=1;j<=n;j++)
          if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j])
             {lowcost[j]=lowcost[pre]+cost[pre][j];path[j]=pre;}
    }
}
int dfs(int i,int n)
{
    if(i==2)  return 1;
    if(sum[i]!=-1)  return sum[i];
    int cnt=0;
    for(int j=1;j<=n;j++)
    {
        if(cost[i][j]<INF&&dis[j]<dis[i])
           cnt+=dfs(j,n);
    }
    sum[i]=cnt;
    return sum[i];
}
int main()
{
    int i,j;
    int n,m;
    int a,b,d;
    while(cin>>n&&n)
    {
        cin>>m;
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++)
           {
               if(i==j)cost[i][j]=0;
               else cost[i][j]=INF;
           }
        while(m--)
        {
            cin>>a>>b>>d;
            cost[a][b]=d;
            cost[b][a]=d;
        }
        Dijkstra(cost,dis,n,2);
        memset(sum,-1,sizeof(sum));
       cout<<dfs(1,n)<<endl;

    }
}

猜你喜欢

转载自blog.csdn.net/s7799653/article/details/51790754