能用容器去做的用容器做,尽量少用数组,即使自己明确其数量的上届;
#include<iostream> #include<cstring> #include<map>//后来我用了一个map容器才能通过,如果自己建立数组就是不过,不知道到底哪里超出了;它明明说的是少于30个,现在做题题意也欺骗人了; using namespace std; const int N=132; int ok; map<string,int>my_map; void nameinput(int n) { string name; for(int i=1;i<=n;i++) { cin>>name; my_map[name]=i; } } double money[N][N]; void Link(int n,int m) { //memset(money,-1,sizeof(money)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) money[i][j]=(i==j)?1:0; string name1,name2; double rate; for(int i=1;i<=m;i++) { cin>>name1>>rate>>name2; money[my_map[name1]][my_map[name2]]=rate; } my_map.clear(); } void deal(int n) { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(money[i][j]<money[i][k]*money[k][j]) money[i][j]=money[i][k]*money[k][j]; } for(int i=1;i<=n;i++) if(money[i][i]>1)//求回路中两点距离; { ok=1;break; } } int main() { int n,m; int count=1; while(cin>>n&&n) { nameinput(n); cin>>m; ok=0; Link(n,m); deal(n); if(ok==1)cout<<"Case "<<count<<": Yes\n"; else cout<<"Case "<<count<<": No\n"; count++; } return 0; }
下面是超时代码:
1 #include<iostream> 2 #include<cstring> 3 #include<map> 4 using namespace std; 5 const int N=132; 6 int ok; 7 int vis[N]; 8 map<string,int>my_map; 9 string Name[N]; 10 void nameinput(int n) 11 { 12 string name; 13 for(int i=1;i<=n;i++) 14 { 15 cin>>name; 16 my_map[name]=i; 17 } 18 } 19 double money[N][N]; 20 void Link(int n,int m) 21 { 22 for(int i=1;i<=n;i++) 23 for(int j=1;j<=n;j++) 24 money[i][j]=(i==j)?1:0; 25 string name1,name2; 26 double rate; 27 for(int i=1;i<=m;i++) 28 { 29 cin>>name1>>rate>>name2; 30 money[my_map[name1]][my_map[name2]]=rate; 31 } 32 my_map.clear(); 33 } 34 void process(int n,int start,int sub,double result) 35 { 36 if(sub==start) 37 { 38 if(result>1)ok=1; 39 return; 40 } 41 double re=result; 42 if(ok==0) 43 for(int i=1;i<=n;i++) 44 { 45 if(money[sub][i]!=-1&&!vis[i]) 46 { 47 vis[i]=1; 48 re=result*money[sub][i]; 49 process(n,start,i,re); 50 vis[i]=0; 51 } 52 if(ok==1)return; 53 } 54 } 55 int main() 56 { 57 int n,m; 58 int count=1; 59 while(cin>>n&&n) 60 { 61 memset(vis,0,sizeof(vis)); 62 nameinput(n); 63 cin>>m; 64 ok=0; 65 Link(n,m); 66 for(int i=1;i<=n;i++) 67 { 68 for(int j=1;j<=n;j++) 69 if(money[i][j]!=-1) 70 { 71 vis[j]=1; 72 process(n,i,j,1.0*money[i][j]); 73 vis[j]=0; 74 } 75 } 76 if(ok==1)cout<<"Case "<<count<<": Yes\n"; 77 else cout<<"Case "<<count<<": No\n"; 78 count++; 79 } 80 return 0; 81 } 82
acm1217教训
时间: 2024-11-09 00:41:57