您的位置:首页 > 其它

hdu 1546 Idiomatic Phrases Game

2014-04-26 16:32 351 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1546

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#define maxn 1001
using namespace std;
const int inf=1<<30;

int a[maxn],n;
int g[maxn][maxn];
char str[maxn][maxn];
int dis[maxn];
bool vis[maxn];

void spfa()
{
queue<int>q;
memset(vis,false,sizeof(vis));
for(int i=0; i<=n; i++) dis[i]=inf;
dis[0]=0;
vis[0]=true;
q.push(0);
while(!q.empty())
{
int u=q.front(); q.pop();
vis[u]=false;
for(int i=0; i<n; i++)
{
if(g[u][i]!=inf&&dis[i]>dis[u]+g[u][i])
{
dis[i]=dis[u]+g[u][i];
if(!vis[i])
{
q.push(i);
vis[i]=true;
}
}
}
}
}

int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=0; i<n; i++)
{
cin>>a[i]>>str[i];
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j) g[i][j]=0;
else g[i][j]=inf;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j) continue;
bool flag=false;
int k=strlen(str[i]);
for(int c=0; c<4; c++)
{
if(str[i][k+c-4]!=str[j][c])
{
flag=true;
break;
}
}
if(!flag)
{
g[i][j]=a[i];
}
}
}
/*for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
printf("%d ",g[i][j]);
}
printf("\n");
}*/
spfa();
if(dis[n-1]==inf) printf("-1\n");
else printf("%d\n",dis[n-1]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: