首页 > 技术文章 > Codevs1062路由选择

xiaoningmeng 2016-08-09 18:07 原文

/*


#include<iostream> #include<cstdio> #include<cstring> #define MAXN 301 using namespace std; int a1[MAXN*MAXN],a2[MAXN*MAXN],a3[MAXN*MAXN]; int n,ans1,ans2,ans3,g[MAXN][MAXN],max1,s,t,ss[MAXN][MAXN],tot,pre[MAXN*MAXN]; bool r[MAXN],b[MAXN]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*f; } void print() { printf("%d ",ans1); for(int i=n;i>=1;i--) if(a1[i]) printf("%d ",a1[i]); printf("\n"); printf("%d ",ans2); for(int i=n;i>=1;i--) if(a2[i]) printf("%d ",a2[i]); printf("\n"); printf("%d ",ans3); for(int i=n;i>=1;i--) if(a3[i]) printf("%d ",a3[i]); printf("\n"); } void slove() { int sum=0;int x=t; if(tot<ans1) { if(a2[1]) { for(int i=1;i<=n;i++) a3[i]=a2[i]; ans3=ans2; } if(a1[1]) { for(int i=1;i<=n;i++) a2[i]=a1[i]; ans2=ans1; } ans1=tot; memset(a1,0,sizeof(a1)); while(x) { a1[++sum]=x; x=pre[x]; } return ; } else if(tot<ans2) { if(a2[1]) { for(int i=1;i<=n;i++) a3[i]=a2[i]; ans3=ans2; } ans2=tot; memset(a2,0,sizeof(a2)); while(x) { a2[++sum]=x; x=pre[x]; } return ; } else if(tot<ans3) { memset(a3,0,sizeof(a3)); ans3=tot; while(x) { a3[++sum]=x; x=pre[x]; } return ; } } void dfs(int x) { if(x==t) { slove(); } for(int i=1;i<=n;i++) if(g[x][i]&&!r[i]&&g[x][i]!=max1) { tot+=g[x][i];g[x][i]=0;pre[i]=x;r[i]=true; dfs(i); tot-=ss[x][i];g[x][i]=ss[x][i];pre[i]=0;r[i]=false; } } int main() { ans1=ans2=ans3=1e8; n=read();s=read();t=read();max1=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=read(),ss[i][j]=g[i][j]; r[s]=true; dfs(s); print(); }

 

推荐阅读