acm1217教训

能用容器去做的用容器做,尽量少用数组,即使自己明确其数量的上届;

#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  
posted @ 2014-07-18 20:02  SYTM  阅读(187)  评论(0编辑  收藏  举报