uva125 Numbering Paths

DP,无耻地搜了解题报告……

DP又卡住了,看了题目就觉得是DP,自己写了一个怎么过不过,另外解决不了环的问题,最后还是看了解题报告

依然是仿照Floyd来DP。i到j经过k,那么i到j的路径数目等于i到k的路径数目乘以k到j的路径数目

DP结束后扫描一遍所有的点,若d[k][k]不为0,说明从k出发能回到k(而题目说了输入不会存在自己到自己的环),那么从k点出发一定存在至少一条回路,d[k][k]=-1

那么i到j,如果经过了点k,就有无数条路径(先从i到k,然后走回路回到k,再从k到j),把d[i][j]=-1

#include <cstdio>
#include <cstring>
#define N 35
int n,m;
int d[N][N];

void print_mat(int T)
{
    printf("matrix for city %d\n",T);
    for(int i=0; i<=n; i++)
    {
        printf("%d",d[i][0]);
        for(int j=1; j<=n; j++)
            printf(" %d",d[i][j]);
        printf("\n");
    }
    return ;
}
void DP()
{
    for(int k=0; k<=n; k++)
        for(int i=0; i<=n; i++)
            for(int j=0; j<=n; j++)
                if(d[i][k] && d[k][j])
                    d[i][j]+=d[i][k]*d[k][j];
    return ;
}
void solve()
{
    for(int k=0; k<=n; k++) if(d[k][k])
    {
        d[k][k]=-1;
        for(int i=0; i<=n; i++)
            for(int j=0; j<=n; j++)
                if(d[i][k] && d[k][j])
                    d[i][j]=-1;
    }
    return ;
}
int main()
{
    int T=0;
    while(scanf("%d",&m)!=EOF)
    {
        memset(d,0,sizeof(d));
        n=-1;
        for(int i=1; i<=m; i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            d[u][v]=1;
            n=u>n?u:n;
            n=v>n?v:n;
        }

        DP();
        solve();
        print_mat(T);
        T++;
    }
    return 0;
}

增强DP啊,另外不要搜解题报告啊,感觉这题再憋一下的还是能憋出来的……搜解题报告的罪恶感好难受……

原文地址:https://www.cnblogs.com/scau20110726/p/2821034.html