最短路神马的最有意思。。。
/*************************************************************************
> File Name: 1210.cpp
> Author: utoppia
> Mail: utoppia@163.com
> Created Time: 2013/12/20 9:12:48
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define sf scanf
#define pf printf
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define ll long long
#define nMax 100010
#define inf 100010000
int first[nMax],nxt[nMax],to[nMax],w[nMax],e;
void addadge(int u,int v,int x){
to[e] = v;w[e] = x;nxt[e] = first[u],first[u] = e;e++;
//to[e] = u;w[e] = x;nxt[e] = first[v],first[v] = e;e++;
}
int id[40][40];
int dist[nMax],nu;
bool vis[nMax];
void spfa(int sor){
queue<int> que;
for(int i=0;i<nu;i++) dist[i] = inf;
for(int i=0;i<nu;i++) vis[i] = false;
dist[sor] = 0;
vis[sor] = true;
que.push(sor);
int u,v;
while(!que.empty()){
u = que.front();
que.pop();
for(int i=first[u];i!=-1;i=nxt[i]){
v = to[i];
if(dist[v] > dist[u] + w[i]) {
dist[v] = dist[u] + w[i];
if(!vis[v]) {
que.push(v);
vis[v] = true;
}
}
}
vis[u] = false;
}
}
int n;
int z,val;
char tmp[100];
#define bug() puts("Here");
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(~sf("%d",&n)){
e = nu = 0;
memset(first,-1,sizeof(first));
id[0][1] = nu ++;
for(int i=1;i<=n;i++){
sf("%d",&id[i][0]);
for(int j=1;j<=id[i][0];j++) {
id[i][j] = nu ++;
while(1) {
sf("%d",&z);
if(z == 0) break;
sf("%d",&val);
addadge(id[i-1][z],id[i][j],val);
}
}
if(i!=n)
sf("%s",tmp);
}
/*
for(int i=1;i<=n;i++) {
for(int j=1;j<=id[i][0];j++){
pf("i=%d ,j=%d ,id=%d\n",i,j,id[i][j]);
}
}
bug()
*/
spfa(0);
int ans = inf;
for(int i=1;i<=id[n][0];i++) ans = min(ans,dist[id[n][i]]);
pf("%d\n",ans);
}
return 0;
}