文化之旅
題目背景
本題是錯題,后來被證明沒有靠譜的多項式復雜度的做法。測試數據非常的水,各種玄學做法都可以通過(比如反著掃),不代表算法正確。因此本題題目和數據僅供參考。
題目描述
有一位使者要游歷各國,他每到一個國家,都能學到一種文化,但他不愿意學習任何一種文化超過一次(即如果他學習了某種文化,則他就不能到達其他有這種文化的國家)。不同的國家可能有相同的文化。不同文化的國家對其他文化的看法不同,有些文化會排斥外來文化(即如果他學習了某種文化,則他不能到達排斥這種文化的其他國家)。
現給定各個國家間的地理關系,各個國家的文化,每種文化對其他文化的看法,以及這位使者游歷的起點和終點(在起點和終點也會學習當地的文化),國家間的道路距離,試求從起點到終點最少需走多少路。
輸入格式
第一行為五個整數N,K,M,S,TN,K,M,S,T,每兩個整數之間用一個空格隔開,依次代表國家個數(國家編號為11到NN),文化種數(文化編號為11到KK),道路的條數,以及起點和終點的編號(保證SS不等于TT);
第二行為NN個整數,每兩個整數之間用一個空格隔開,其中第ii個數C_iCi?,表示國家ii的文化為C_iCi?。
接下來的KK行,每行KK個整數,每兩個整數之間用一個空格隔開,記第ii行的第 j 個數為a_{ij}aij?,a_{ij}= 1aij?=1表示文化ii排斥外來文化jj(ii等于jj時表示排斥相同文化的外來人),a_{ij}= 0aij?=0表示不排斥(注意ii排斥jj并不保證jj一定也排斥ii)。
接下來的MM行,每行三個整數u,v,du,v,d,每兩個整數之間用一個空格隔開,表示國家uu與國家vv有一條距離為dd的可雙向通行的道路(保證uu不等于vv,兩個國家之間可能有多條道路)。
輸出格式
一個整數,表示使者從起點國家到達終點國家最少需要走的距離數(如果無解則輸出-1?1)。
輸入輸出樣例
輸入 #1
2 2 1 1 2 1 2 0 1 1 0 1 2 10
輸出 #1
-1
輸入 #2
2 2 1 1 2 1 2 0 1 0 0 1 2 10
輸出 #2
10
說明/提示
輸入輸出樣例說明11
由于到國家22必須要經過國家11,而國家22的文明卻排斥國家11的文明,所以不可能到達國家22。
輸入輸出樣例說明22
路線為11->22
【數據范圍】
對于 100%的數據,有2≤N≤1002≤N≤100
1≤K≤1001≤K≤100
1≤M≤N^21≤M≤N2
1≤k_i≤K1≤ki?≤K
1≤u, v≤N1≤u,v≤N
1≤d≤1000,S≠T,1≤S,T≤N1≤d≤1000,S≠T,1≤S,T≤N
NOIP 2012 普及組 第四題
題目都這么說了,我就玄學了一把,然后就過了……
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,m,s,t,c[120],g[120][120],f[120][120],aa,bb,cc,i,j;
int main(){
scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
f[i][j]=21743822;
}
}
for(i=1;i<=n;i++){
scanf("%d",&c[i]);
}
for(i=1;i<=k;i++){
for(j=1;j<=k;j++){
scanf("%d",&g[i][j]);
}
}
for(i=1;i<=m;i++){
scanf("%d%d%d",&aa,&bb,&cc);
if(!g[c[bb]][c[aa]]&&c[bb]!=c[aa]){
f[aa][bb]=min(f[aa][bb],cc);
}
if(!g[c[aa]][c[bb]]&&c[bb]!=c[aa]){
f[bb][aa]=min(f[bb][aa],cc);
}
}
if(c[s]==c[t]){
printf("-1");
return 0;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i!=j){
for(k=1;k<=n;k++){
if(j!=k&&i!=k){
if(f[i][k]+f[k][j]<f[i][j]){
f[i][j]=f[i][k]+f[k][j];
}
}
}
}
}
}
if(f[s][t]==21743822){
printf("-1");
}
else{
printf("%d",f[s][t]);
}
return 0;
}
總結
- 上一篇: 王者荣耀卡顿延迟高怎么解决 玩王者荣耀卡
- 下一篇: 镜头主要参数工业相机镜头的参数与选型