这道题有好几种做法,这里用的是bellman。从起始币种src出发计算所有币种可兑换起始币种的最大值。
用cin读取字符串貌似非常耗时,用了900+ms,差点超时。
只是稍微用%s改下输入,就只用了32ms
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#define MAXD 32
#define INF 0x3f3f3f3f
using namespace std;
int N,M;
double graph[MAXD][MAXD];
bool vis[MAXD][MAXD],flag;
struct NODE
{
char name[MAXD];
double d;
}node[MAXD];
void relax()
{
int i,j;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(vis[i][j]&&node[j].d<(node[i].d*graph[i][j]))
{
node[j].d=node[i].d*graph[i][j];
}
}
}
}
void bellman(int src)
{
int i;
for(i=1;i<=N;i++)
node[i].d=0;
node[src].d=1.0;
for(i=1;i<=N;i++)
relax();
if(node[src].d>1.0)
flag=true;
}
int main()
{
//freopen("test.txt","r",stdin);
int num=0;
while(scanf("%d",&N)!=EOF)
{
if(N==0)
return 0;
int i,j;
memset(vis,0,sizeof(vis));
memset(graph,0,sizeof(graph));
for(i=1;i<=N;i++)
{
scanf("%s",node[i].name);
}
scanf("%d",&M);
char src[MAXD],des[MAXD];
int first,second;
double rate;
for(i=1;i<=M;i++)
{
scanf("%s%lf%s",src,&rate,des);
for(j=1;j<=N;j++)
{
if(strcmp(node[j].name,src)==0)
{
first=j;
}
if(strcmp(node[j].name,des)==0)
{
second=j;
}
}
vis[first][second]=true;
graph[first][second]=rate;
}
flag=false;
bellman(1);
if(flag)
printf("Case %d: Yes\n",++num);
else
printf("Case %d: No\n",++num);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#define MAXD 32
#define INF 0x3f3f3f3f
using namespace std;
int N,M;
double graph[MAXD][MAXD];
bool vis[MAXD][MAXD],flag;
struct NODE
{
char name[MAXD];
double d;
}node[MAXD];
void relax()
{
int i,j;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(vis[i][j]&&node[j].d<(node[i].d*graph[i][j]))
{
node[j].d=node[i].d*graph[i][j];
}
}
}
}
void bellman(int src)
{
int i;
for(i=1;i<=N;i++)
node[i].d=0;
node[src].d=1.0;
for(i=1;i<=N;i++)
relax();
if(node[src].d>1.0)
flag=true;
}
int main()
{
//freopen("test.txt","r",stdin);
int num=0;
while(scanf("%d",&N)!=EOF)
{
if(N==0)
return 0;
int i,j;
memset(vis,0,sizeof(vis));
memset(graph,0,sizeof(graph));
for(i=1;i<=N;i++)
{
scanf("%s",node[i].name);
}
scanf("%d",&M);
char src[MAXD],des[MAXD];
int first,second;
double rate;
for(i=1;i<=M;i++)
{
scanf("%s%lf%s",src,&rate,des);
for(j=1;j<=N;j++)
{
if(strcmp(node[j].name,src)==0)
{
first=j;
}
if(strcmp(node[j].name,des)==0)
{
second=j;
}
}
vis[first][second]=true;
graph[first][second]=rate;
}
flag=false;
bellman(1);
if(flag)
printf("Case %d: Yes\n",++num);
else
printf("Case %d: No\n",++num);
}
return 0;
}