NOIP2012普及组 (四年后的)解题报告 -SilverN
Posted 报告振兴哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2012普及组 (四年后的)解题报告 -SilverN相关的知识,希望对你有一定的参考价值。
本章施工仍未完成
现在的时间是3.17 0:28,我困得要死
本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤。
尝试了用floyd写T4,终于大功告成AC后,看到别人的解题报告说fl能过只是因为测试数据范围小。
好像主要有三种解法,fl,dij,dfs
dfs暂时弃,dij写到现在还没完成,先把fl的放上来。
等攻下T4,再施工前面三道题
T4-Floyd:
读完数据以后,只要把文化不兼容的城市的路都堵上,就可以用floyd了
可怜我之前堵路无方,写了一大堆判定条件还没见效……
AC代码如下
1 /*NOIP普及组2012 t4 culture*/ 2 //根据多个解题报告所说,floyd算法能过只是因为数据范围小 3 //我们需要dij或者dfs 4 #include<iostream> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 const int inf=10000000; 9 int c[5000];//文明[i]的文化 10 int fl[300][300];//文化拒绝 11 int mp[300][300];//图 12 //int DFS(){ 13 14 //} 15 int main(){ 16 int i,j,n,k,m,s,t; 17 // freopen("culture.in","r",stdin); 18 // freopen("culture.out","w",stdout); 19 //in 20 scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); 21 for(i=1;i<=n;i++){ 22 scanf("%d",&c[i]); 23 } 24 for(i=1;i<=n;i++) 25 for(j=1;j<=n;j++){ 26 if(i!=j)mp[i][j]=inf;//预处理 27 } 28 for(i=1;i<=k;i++) 29 for(j=1;j<=k;j++) 30 scanf("%d",&fl[i][j]);//读入文化兼容情况 31 32 for(i=1;i<=m;i++){ 33 int u,v,d; 34 scanf("%d%d%d",&u,&v,&d); 35 mp[u][v]=min(mp[u][v],d);//两座城市间若有多条道路,记录最短的即可 36 mp[v][u]=mp[u][v];//双向图 37 } 38 for(i=1;i<=n;i++) 39 for(j=1;j<=n;j++){ 40 if(fl[c[i]][c[j]]==1)mp[j][i]=inf;//如果文化不兼容,相当于道路不通 41 //刚开始mp[j][i]误打成mp[i][j],费了半天时间查错 42 //这部分原本想边读边处理,但是发现会影响到双向距离处理,只好单拿出来了 43 } 44 // 45 //floyd 不能走的路之前都处理成inf了,直接floyd就行 46 for(k=1;k<=n;k++) 47 for(i=1;i<=n;i++) 48 for(j=1;j<=n;j++){ 49 if(mp[i][k]+mp[k][j]<mp[i][j]){ 50 mp[i][j]=mp[i][k]+mp[k][j]; 51 } 52 } 53 // 54 if(mp[s][t]==inf)printf("-1"); 55 else printf("%d",mp[s][t]); 56 // fclose(stdin); 57 // fclose(stdout); 58 return 0; 59 60 }
以上是关于NOIP2012普及组 (四年后的)解题报告 -SilverN的主要内容,如果未能解决你的问题,请参考以下文章