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啊,另外不要搜解题报告啊,感觉这题再憋一下的还是能憋出来的……搜解题报告的罪恶感好难受……