首页 > 代码库 > hdu1853 Cyclic Tour 完美匹配 验证模版
hdu1853 Cyclic Tour 完美匹配 验证模版
题意:
给出n个城市和m条路,每个城市只能经过一次,想要旅游所有的城市,求需要的最小花费(路径的长度)。
对于我来说,这题就是验证模版。把输入数据全部改为负数,错误了返回1。最后乘以-1就行了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=110, INF=0x3f3f3f3f; 7 int Map[N][N],mat1[N],mat2[N];//匹配上的左右集合 8 int KM(int m,int n) 9 {10 int s[N],t[N],a[N],b[N];11 int i,j,k,p,q,ans=0;12 for(i=0;i<m;i++)13 {14 a[i]=-INF;15 for(j=0;j<n;j++)16 a[i]=Map[i][j]>a[i]?Map[i][j]:a[i];17 if(a[i]==-INF) return 1;//cannot match18 }19 memset(b,0,sizeof(b));20 memset(mat1,-1,sizeof(mat1));21 memset(mat2,-1,sizeof(mat2));22 for(i=0;i<m;i++)23 {24 memset(t,-1,sizeof(t));25 p=q=0;26 for(s[0]=i;p<=q&&mat1[i]<0;p++)27 {28 for(k=s[p],j=0;j<n&&mat1[i]<0;j++)29 {30 if(a[k]+b[j]==Map[k][j]&&t[j]<0)31 {32 s[++q]=mat2[j]; t[j]=k;33 if(s[q]<0)34 for(p=j;p>=0;j=p)35 {36 mat2[j]=k=t[j];p=mat1[k]; mat1[k]=j;37 }38 }39 }40 }41 if(mat1[i]<0)42 {43 i--,p=INF;44 for(k=0;k<=q;k++)45 {46 for(j=0;j<n;j++)47 if(t[j]<0&&a[s[k]]+b[j]-Map[s[k]][j]<p)48 p=a[s[k]]+b[j]-Map[s[k]][j];49 }50 for(j=0;j<n;j++) b[j]+=t[j]<0?0:p;51 for(k=0;k<=q;k++) a[s[k]]-=p;52 }53 }54 for(i=0;i<m;i++) ans+=Map[i][mat1[i]];55 return ans;56 }57 void init()58 {59 for(int i=0;i<N;i++)60 for(int j=0;j<N;j++)61 Map[i][j]=-INF;62 }63 int main()64 {65 //freopen("test.txt","r",stdin);66 int n,i,j,m,k;67 while(scanf("%d%d",&n,&m)!=EOF)68 {69 init();70 while(m--)71 {72 scanf("%d%d%d",&i,&j,&k);73 i--;j--;k=-k;74 Map[i][j]=max(Map[i][j],k);75 }76 printf("%d\n",-1*KM(n,n));77 }78 return 0;79 }
hdu1853 Cyclic Tour 完美匹配 验证模版
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。