hdu 1142(最短路dijkstra)

来源:互联网 发布:编程电脑配置要求2017 编辑:程序博客网 时间:2024/06/05 11:29
假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,
则可以从 A 通往 B 处,问满足这种的条件的路径条数。
     1、以终点 2 为起点 dijkstra;

     2、直接DFS记忆化搜索。


#include <iostream>#include <stdio.h>#include <string.h>#define MAX 1010#define INF 99999999using namespace std;int n,m;int g[MAX][MAX],dis[MAX],vis[MAX],is[MAX];void init(){    for(int i=0;i<=n;i++)    {         for(int j=0;j<=n;j++)         {            g[i][j]=INF;dis[i]=INF;         }    }    for(int i=0;i<=n;i++)g[i][i]=0;    memset(vis,0,sizeof(vis));    memset(is,0,sizeof(is));}void dijkstra(int s){    int k,mm;    for(int i=1;i<=n;i++)    {        dis[i]=g[s][i];    }    vis[s]=1;    dis[s]=0;    for(int i=2;i<=n;i++)    {        mm=INF;        k=s;//这句话很重要啊!!害我RE了好多次,有可能木有啊        for(int j=1;j<=n;j++)        {            if(!vis[j])            {                if(mm>dis[j])                {                    mm=dis[j];                    k=j;                }            }        }        vis[k]=1;        for(int j=1;j<=n;j++)        {            if(!vis[j])            {                if(dis[j]>mm+g[k][j])                {                    dis[j]=mm+g[k][j];                }            }        }    }}int dfs(int s){    if(is[s]) return is[s];    if(s==2)return 1;    int res=0;    for(int i=1;i<=n;i++)    {        if(g[s][i]<INF&&dis[s]>dis[i])        {           is[s]+=dfs(i);        }    }    return is[s];}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d",&n)&&n)    {        init();        scanf("%d",&m);        for(int i=0;i<m;i++)        {            int a,b,d;            scanf("%d%d%d",&a,&b,&d);            g[b][a]=g[a][b]=d;        }        dijkstra(2);        printf("%d\n",dfs(1));    }    return 0;}


0 0
原创粉丝点击