最短路

当我用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.......

posted @ 2018-08-02 14:52  DJY_01  阅读(114)  评论(1编辑  收藏  举报