您的位置:首页 > 其它

2016sdau课程练习专题三 1010

2016-07-09 12:01 330 查看
1.题目编号

1010

2.简单题意

一个人的办公室用1表示,家用2 表示,从1到2,中间可能会经过其它节点,而该节点可走的原则是:假设他此时在A处,B与其相邻,只有当B到2 路线中存在一条比A到2 的任意一条路径都短的路径,才能走B。问这样的路线有多少种?
3.解题思路

求出各点到2-1的最短距离 同时存贮其它点到2的最短距离,然后记忆化搜索 从1开始 找到符合条件的路径数
4.感想

题目很难理解,毕竟是英文啊,而且这道题做起来太难了,考虑的情况有点多

5.代码

#include<iostream>

#include<queue>

using namespace std;

 

typedef struct n1

{

    int  distens,flog;

}node;

node N[1005];

int map[1005][1005],k;

int direct[1005];

void set(int n)

{

    int i,j,m,n1,n2,d;

    for(i=1;i<=n;i++)

    {

        for(j=1;j<=n;j++)

        {

            map[i][j]=-1;

        }

         N[i].distens=10000000;N[i].flog=0;direct[i]=0;

    }

 

    scanf("%d",&m);

    while(m--)

    {

        scanf("%d%d%d",&n1,&n2,&d);

        if(map[n1][n2]!=0||map[n1][n2]>d)

        map[n1][n2]=map[n2][n1]=d;

    }

}

void spfa(int n)

{

    queue<int> Q;

    int now;

    int i;

     N[2].distens=0;N[2].flog=1;

    Q.push(2);

    while(!Q.empty())

    {

        now=Q.front();

        Q.pop();

        N[now].flog=0;

        //if(q.x==1)break;

        for(i=1;i<=n;i++)

        if(map[now][i]!=-1)

        {

            if(N[i].distens>N[now].distens+map[now][i])

            {

                N[i].distens=N[now].distens+map[now][i];

                if(N[i].flog==0)

                {

                    N[i].flog=1;

                    Q.push(i);

                }

            }

        }

    }

}

int DFS(int now,int n)

{

    int i;

    if(direct[now]>0)

    return direct[now];

    if(now==2)

    {

        return 1;

    }

    for(i=1;i<=n;i++)

    if(map[now][i]!=-1&&N[now].distens>N[i].distens)

    {

        direct[now]+=DFS(i,n);

    }

 

   return direct[now];

}

int main()

{

    int n;

    while(scanf("%d",&n)>0&&n)

    {

        set(n);

        spfa(n);

        k=DFS(1,n);

        printf("%d\n",k);

    }

}

 void init( int n ){

     for( int i=0;i<n;i++ ){

         fa[i] = i;

         circle[ i ] = -1;

     }

 }

 int cmp( node a,node b ){

     return a.val>b.val;

 }

 int main(){

     int n,m;

     while( scanf("%d%d",&n,&m)==2,n||m ){

         //if( n==0&&m==0 ) break;

         for( int i=0;i<m;i++ )

             scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].val);

         init( n );

         sort( edge,edge+m,cmp );

         int ans = 0;

         for( int i=0;i<m;i++ ){

             if( union_ab( edge[i].u,edge[i].v) )

                 ans += edge[i].val;

         }

         printf("%d\n",ans);

     }

     return 0;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: