华丽丽的建图不解释~哈哈哈~
纯stl的建图内存只有480k~~~输入输出都是c++时间还能达到62ms~~map离散化建图,很好、很强大~
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn=1111;
const int inf=0x3f3f3f3f;
string s[maxn];
int cost[maxn];
int way[maxn];
bool vis[maxn];
vector<int>g[maxn];
vector<int>v[maxn];
queue<int>q;
map<string,int>mp;
int have,n,lg,now,len,tv;
void build()
{
have=0;
mp.clear();
for(int i=0;i<maxn;i++)
{
v[i].clear();
g[i].clear();
}
string temp;
for(int i=1;i<=n;i++)
{
temp = s[i].substr(0,4);
if (mp.find(temp) == mp.end())
{
mp[temp]=have;
v[have].push_back(i);
have++;
}
else
{
v[mp[temp] ].push_back(i);
}
}
for(int i=1;i<=n;i++)
{
lg=s[i].length()-4;
temp=s[i].substr(lg,4);
if(mp.find(temp) != mp.end())
{
g[i]=v[mp[temp]];
}
}
return ;
}
void spfa()
{
while(!q.empty())
{
q.pop();
}
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
{
way[i]=inf;
}
way[1]=0;
vis[1]=true;
q.push(1);
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<g[now].size();i++)
{
tv=g[now][i];
len=way[now] + cost[now];
if( len < way[tv] )
{
way[tv]=len;
if(!vis[tv])
{
q.push(tv);
vis[tv]=true;
}
}
}
vis[now]=false;
}
return ;
}
int main()
{
while(cin>>n)
{
if(!n) break;
for(int i=1;i<=n;i++)
{
cin>>cost[i]>>s[i];
}
build();
spfa();
if(way[n]==inf)
{
cout<<"-1"<<endl;
}
else
{
cout<<way[n]<<endl;
}
}
return 0;
}