1010 problem J

来源:互联网 发布:淘宝订单业务流程 编辑:程序博客网 时间:2024/06/05 18:57

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

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define MAXN 1005int 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;    }}
0 0
原创粉丝点击