最短路
当我用DFS做对时又看了看各位大佬的题解我一口老血喷出来,大佬们干嘛这么麻烦....都用不到最短路.....用DFS加个判重和一点点剪枝就A了... 代码:
#include<bits/stdc++.h> using namespace std; int a[1100][1100],b[1100][1100],ans[1100]={0}; int maxn=2147483647,n,m;//设2147483647就是最大值 void dfs(int k,int sum) { if(sum>maxn) return ;//剪枝,如果当前的值已经大于上一次的值了,那还找他干嘛 if(k==n)//如果到终点了 { maxn=min(maxn,sum);//取最小值 return ; } for(int i=1;i<=n;i++) { if(b[k][i]!=2147483647&&ans[i]==0)//这条路没走过 { ans[i]=1;//回溯 dfs(i,(sum*b[k][i])%9987);//乘法加上取余 ans[i]=0; } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) b[i][j]=0;//初始化 else b[i][j]=2147483647; } } int x,y,z; for(int i=1;i<=m;i++) { cin>>x>>y>>z;//读入 b[x][y]=z; } ans[1]=1;//从第一个点出发 dfs(1,1);//乘法从一开始 cout<<maxn; }
emm.......