#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define maxn 310
#define INF 0x3f3f3f3f
int mp[maxn][maxn];
int dis[maxn];
int n;
void spfa(int st){
queue<int> q;
for(int i=1;i<=n;i++){
if(i==st){
dis[i]=INF;
}else{
dis[i]=mp[st][i];
q.push(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(dis[i]>dis[u]+mp[u][i]){
dis[i]=dis[u]+mp[u][i];
q.push(i);
}
}
}
}
int main(){
while(~scanf("%d", &n)){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d", &mp[i][j]);
}
}
spfa(1);
int ans=dis[n];
int c1=dis[1];
spfa(n);
int c2=dis[n];
printf("%d\n", min(ans,c1+c2));
}
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <map>
#include <iostream>
using namespace std;
#define maxn 100000
#define INF 0x3f3f3f
map<string,int> mp;
struct node{
int u,v;
double w;
int next;
}edge[maxn];
int head[maxn];
double dis[maxn];
string a,b;
int cnt,n,t;
int B=1;
void init(){
memset(dis,0,sizeof dis);
memset(head,-1,sizeof head);
cnt=0;
}
void add(int u,int v,double w){
edge[cnt].w=w;
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool spfa(int B){
dis[B]=1;
queue<int> q;
q.push(B);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]<dis[u]*edge[i].w){
dis[edge[i].v]=dis[u]*edge[i].w;
if(dis[B]>1) return true;
q.push(edge[i].v);
}
}
}
return false;
}
int main(){
int T=1;
while(~scanf("%d", &n)&&n){
init();
for(int i=1;i<=n;i++){
cin>>a;
mp[a]=i;
}
scanf("%d", &t);
double w;
for(int i=0;i<t;i++){
cin>>a>>w>>b;
add(mp[a],mp[b],w);
}
printf("Case %d: ", T++);
if(spfa(B)) printf("Yes\n");
else printf("No\n");
}
}
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
#define maxn 30010
#define maxm 150010
#define INF 0x3f3f3f
struct node{
int u,v,w;
int next;
}edge[maxm];
int head[maxn];
int dis[maxn];
bool color[maxn];
int cnt,n,t;
void init(){
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa(){
memset(color,true,sizeof color);
stack<int> q;
dis[1]=0;
q.push(1);
color[1]=false;
while(!q.empty()){
int u=q.top();
q.pop();
color[u]=true;
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
if(color[edge[i].v]){
q.push(edge[i].v);
color[edge[i].v]=false;
}
}
}
}
return;
}
int main(){
while(~scanf("%d %d", &n, &t)){
init();
int u,v,w;
for(int i=0;i<t;i++){
scanf("%d %d %d", &u, &v, &w);
add(u,v,w);
}
spfa();
printf("%d\n", dis[n]);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define maxn 110
#define INF 0x3f3f3f
int mp[maxn][maxn];
int n,t;
void init(){
memset(mp,0,sizeof mp);
}
int main(){
scanf("%d %d", &n, &t);
init();
int u,v;
for(int i=0;i<t;i++){
scanf("%d %d", &u, &v);
mp[u][v]=1;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][k]&&mp[k][j]) mp[i][j]=1;
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
int j;
for(j=1;j<=n;j++){
if(i==j) continue;
if(!mp[i][j]&&!mp[j][i]) break;
}
if(j>n) ans++;
}
printf("%d\n", ans);
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f
#define maxn 10010
struct node{
double wa, a;
int e;
int next;
}edge[maxn];
int cnt;
int head[maxn];
int n,t,lei;
double num;
void init(){
memset(head,0,sizeof head);
cnt=1;
}
void add(int u,int v,double a, double wa){
edge[cnt].wa=wa;
edge[cnt].a=a;
edge[cnt].e=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool spfa(int sb){
queue<int> q;
bool color[maxn];
double d[maxn];
memset(d,0,sizeof d);
memset(color,true,sizeof color);
q.push(sb);
d[sb]=num;
color[sb]=false;
while(!q.empty()){
int st=q.front();
q.pop();
color[st]=true;
for(int i=head[st];i!=0;i=edge[i].next){
if((d[st]-edge[i].wa)*edge[i].a>d[edge[i].e]){
d[edge[i].e]=(d[st]-edge[i].wa)*edge[i].a;
if(d[sb]>num) return true;
if(color[edge[i].e]){
q.push(edge[i].e);
color[edge[i].e]=false;
}
}
}
}
return false;
}
int main(){
scanf("%d %d %d %lf", &n, &t, &lei, &num);
init();
int u,v;
double a,b,wa,wb;
for(int i=0;i<t;i++){
scanf("%d %d %lf %lf %lf %lf", &u, &v, &a, &wa, &b, &wb);
add(u, v, a, wa);
add(v, u, b, wb);
}
if(spfa(lei)) printf("YES\n");
else printf("NO\n");
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <iostream>
#include <cmath>
using namespace std;
#define maxt 1000000
#define maxn 1000
#define INF 0x3f3f3f3f
struct node{
int u,v,w;
int next;
}edge[maxt];
int head[maxn];
int dis[maxn];
int d[maxn];
int color[maxn];
int cnt,n,t;
void init(){
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
memset(color,0,sizeof color);
memset(edge,0,sizeof edge);
memset(d,0,sizeof d);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool spfa(){
queue<int> q;
dis[1]=0;
q.push(1);
color[1]++;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
q.push(edge[i].v);
if(++color[edge[i].v]>=n) return false;
}
}
}
return true;
}
int main(){
int T;
int q,u,v,w;
scanf("%d", &T);
for(int s=1;s<=T;s++){
init();
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d", &d[i]);
}
scanf("%d", &t);
for(int i=0;i<t;i++){
scanf("%d %d", &u, &v);
add(u,v,(d[v]-d[u])*(d[v]-d[u])*(d[v]-d[u]));
}
bool ll=spfa();
scanf("%d", &q);
printf("Case %d:\n", s);
while(q--){
scanf("%d", &w);
int ans=dis[w];
if(ans<3||ans==INF) printf("?\n");
else printf("%d\n", dis[w]);
}
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <cmath>a
#define maxn 1005
#define INF 0x3f3f3f
using namespace std;
struct node{
int x,y;
}num[maxn];
double mp[maxn][maxn];
double calc(int i, int j) {
return (sqrt(pow((double)num[i].x-num[j].x, 2)+pow((double)num[i].y-num[j].y, 2)));
}
int n;
double dijkstra() {
bool vis[maxn];
double d[maxn];
memset(vis, false, sizeof(vis));
for(int i=0; i<n; i++) {
d[i] = mp[0][i];
}
d[0] = 0;
vis[0] = true;
for(int i=0; i<n-1; i++) {
double m = INF; int x;
for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y];
vis[x] = true;
for(int y=0; y<n; y++){
if(!vis[y]) {
double maxx = max(d[x], mp[x][y]);
if(d[y] > maxx) d[y] = maxx;
}
}
}
return d[1];
}
int main(){
int m=0;
while(cin>>n,n){
m++;
for(int i=0;i<n;i++) cin>>num[i].x>>num[i].y;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mp[i][j]=mp[j][i]=calc(i,j);
}
mp[i][i]=0;
}
printf("Scenario #%d\n", m);
printf("Frog Distance = %.3lf\n\n", dijkstra());
}
return 0;
}
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int w[1010][1010];
int d[1010];
bool vis[1010];
int n,m;
void djs()
{
for(int i=1; i<=n; i++)
{
d[i]=w[1][i];
vis[i]=0;
}
for(int i=1; i<=n; i++)
{
int m=-1;
int x=-1;
for(int j=1; j<=n; j++)
if(!vis[j]&&d[j]>m)
m=d[x=j];
if(x!=-1)
{
vis[x]=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&d[j]<min(d[x],w[x][j]))
d[j]=min(d[x],w[x][j]);
}
}
}
int main()
{
int T,t=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
w[i][j]=i==j?0:-1;
for(int i=1; i<=m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(w[x][y]<z)
w[x][y]=w[y][x]=z;
}
djs();
printf("Scenario #%d:\n%d\n\n",t++,d[n]);
}
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 1000100
#define INF 0x3f3f3f
struct node{
int u,v;
int w;
int next;
}edge[maxn],uedge[maxn];
int head[maxn],uhead[maxn];
int dis[maxn],udis[maxn];
int cnt,ucnt,n,t;
void init(){
memset(head,-1,sizeof head);
memset(uhead,-1,sizeof uhead);
memset(dis,INF,sizeof dis);
memset(udis,INF, sizeof udis);
cnt=0;
ucnt=0;
}
void add(int u,int v,int w,int &cnt, int *head, node *edge){
edge[cnt].w=w;
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa(int st,int *dis,int *head, node *edge){
dis[st]=0;
queue<int> q;
q.push(st);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
q.push(edge[i].v);
}
}
}
}
int main(){
int T,u,v,w;
scanf("%d", &T);
while(T--){
init();
scanf("%d %d", &n, &t);
for(int i=0;i<t;i++){
scanf("%d %d %d", &u, &v, &w);
add(u,v,w,cnt,head,edge);
add(v,u,w,ucnt,uhead,uedge);
}
spfa(1,dis,head,edge);
spfa(1,udis,uhead,uedge);
long long ans=0;
for(int i=1;i<=n;i++){
ans+=(long long)(udis[i]+dis[i]);
}
printf("%lld\n", ans);
}
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <iostream>
#include <cmath>
using namespace std;
#define maxn 1000000
#define INF 0x3f3f3f3f
struct node{
int u,v,w;
int next;
}edge[maxn];
int head[maxn];
int dis[maxn];
int color[maxn];
int cnt,n,t1,t2;
void init(){
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
memset(color,0,sizeof color);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool spfa(){
queue<int> q;
dis[1]=0;
q.push(1);
color[1]++;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
q.push(edge[i].v);
if(++color[edge[i].v]>=n) return false;
}
}
}
return true;
}
int main(){
scanf("%d %d %d", &n, &t1, &t2);
init();
int u,v,w;
for(int i=0;i<t1;i++){
scanf("%d %d %d", &u, &v, &w);
if(u>v)swap(u,v);
add(u,v,w);
}
for(int i=0;i<t2;i++){
scanf("%d %d %d", &u, &v, &w);
if(u<v)swap(u,v);
add(u,v,-w);
}
if(spfa()){
if(dis[n]==INF){
printf("-2\n");
}else{
printf("%d\n", dis[n]);
}
}else{
printf("-1\n");
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f
#define maxn 100010
struct node{
int u, v, w;
int next;
}edge[maxn], uedge[maxn], wedge[maxn*2];
int head[maxn], uhead[maxn], whead[maxn];
int cnt, ucnt, wcnt;
int dis[maxn], udis[maxn];
int d[maxn];
int t,n,B,E;
void init(){
memset(head, -1, sizeof head);
memset(uhead, -1, sizeof uhead);
memset(whead, -1, sizeof whead);
memset(dis, INF, sizeof dis);
memset(udis, INF, sizeof udis);
cnt = ucnt = wcnt = 0;
}
void add(int u, int v, int w, node edge[], int &cnt, int *head){
edge[cnt].w=w;
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void add_dinic(int u,int v,int w){
wedge[wcnt].w=w;
wedge[wcnt].u=u;
wedge[wcnt].v=v;
wedge[wcnt].next=whead[u];
whead[u]=wcnt++;
wedge[wcnt].w=0;
wedge[wcnt].u=v;
wedge[wcnt].v=u;
wedge[wcnt].next=whead[v];
whead[v]=wcnt++;
}
void spfa(int st, int *dis, int *head, node edge[]){
queue<int> q;
bool color[maxn];
memset(color,true,sizeof color);
q.push(st);
dis[st]=0;
color[st]=false;
while(!q.empty()){
int u=q.front();
q.pop();
color[u]=true;
for(int i=head[u];~i;i=edge[i].next){
if(dis[u]+edge[i].w<dis[edge[i].v]){
dis[edge[i].v]=dis[u]+edge[i].w;
if(color[edge[i].v]){
q.push(edge[i].v);
color[edge[i].v]=false;
}
}
}
}
}
bool bfs(int B,int E){
memset(d,-1,sizeof d);
queue<int> q;
d[B]=0;
q.push(B);
while(!q.empty()){
int st=q.front();
q.pop();
for(int i=whead[st];~i;i=wedge[i].next){
if(d[wedge[i].v]==-1&&wedge[i].w>0){
d[wedge[i].v]=d[st]+1;
q.push(wedge[i].v);
}
}
}
return d[E]!=-1;
}
int dfs(int a,int b){
int r=0;
if(a==E) return b;
for(int i=whead[a];~i;i=wedge[i].next){
if(wedge[i].w>0&&d[wedge[i].v]==d[a]+1){
int x=min(wedge[i].w,b-r);
x=dfs(wedge[i].v,x);
r+=x;
wedge[i].w-=x;
wedge[i^1].w+=x;
}
}
if(!r) d[a]=-2;
return r;
}
int dinic(int B,int E){
int ans=0;
int t;
while(bfs(B,E)){
while(t=dfs(B,INF)) ans+=t;
}
return ans;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &t);
init();
for(int i=0;i<t;i++){
int u,v,w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, w, edge, cnt, head);
add(v, u, w, uedge, ucnt, uhead);
}
scanf("%d %d", &B ,&E);
spfa(B, dis, head, edge);
if(dis[E]==INF){
printf("0\n");
continue;
}
long long tmp = dis[E];
spfa(E, udis, uhead, uedge);
for(int i=0;i<t;i++){
int u=edge[i].u,v=edge[i].v;
if(edge[i].w&&dis[u]+udis[v]+edge[i].w==tmp){
add_dinic(u,v,1);
}
}
printf("%d\n", dinic(B,E));
}
return 0;
}
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 0x3f3f3f
#define maxn 110
int mp[maxn][maxn];
int dis[maxn];
int n,B=1;
int return_int(char *a){
int ans=0;
int len=strlen(a);
for(int i=0;i<len;i++){
ans=a[i]-'0'+ans*10;
}
return ans;
}
void init(){
memset(mp,INF,sizeof mp);
memset(dis,INF,sizeof dis);
}
void spfa(int B){
dis[B]=0;
queue<int> q;
q.push(B);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(dis[i]>dis[u]+mp[u][i]){
dis[i]=dis[u]+mp[u][i];
q.push(i);
}
}
}
return ;
}
int main(){
scanf("%d", &n);
init();
char a[10];
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
scanf("%s", a);
if(a[0]!='x') mp[i][j]=mp[j][i]=return_int(a);
}
}
spfa(B);
int ans=0;
for(int i=1;i<=n;i++){
if(ans<dis[i]) ans=dis[i];
}
printf("%d\n", ans);
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 1000100
#define INF 0x3f3f3f
struct node{
int u,v;
int w;
int next;
}edge[maxn],uedge[maxn];
int head[maxn],uhead[maxn];
int dis[maxn],udis[maxn];
int cnt,ucnt,n,t,st;
void init(){
memset(head,-1,sizeof head);
memset(uhead,-1,sizeof uhead);
memset(dis,INF,sizeof dis);
memset(udis,INF, sizeof udis);
cnt=0;
ucnt=0;
}
void add(int u,int v,int w,int &cnt, int *head, node *edge){
edge[cnt].w=w;
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa(int st,int *dis,int *head, node *edge){
dis[st]=0;
queue<int> q;
q.push(st);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
q.push(edge[i].v);
}
}
}
}
int main(){
scanf("%d %d %d", &n, &t, &st);
int u,v,w;
init();
for(int i=0;i<t;i++){
scanf("%d %d %d", &u, &v, &w);
add(u,v,w,cnt,head,edge);
add(v,u,w,ucnt,uhead,uedge);
}
spfa(st,dis,head,edge);
spfa(st,udis,uhead,uedge);
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,udis[i]+dis[i]);
}
printf("%d\n", ans);
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
#define maxn 1000
#define INF 0x3f3f3f
struct node{
double x,y;
int kid;
}poi[maxn];
double mp[maxn][maxn];
int cnt=0;
void build(double x,double y,int kid){
poi[cnt].x=x;
poi[cnt].y=y;
poi[cnt].kid=kid;
cnt++;
}
int main(){
double x,y;
int kid=0;
scanf("%lf %lf", &x, &y);
build(x,y,kid++);
scanf("%lf %lf", &x, &y);
build(x,y,kid++);
while(~scanf("%lf %lf", &x, &y)) {
if(x<0&&y<0){
kid++;
continue;
}
build(x,y,kid);
}
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
mp[i][j]=sqrt((poi[i].x-poi[j].x)*(poi[i].x-poi[j].x)+(poi[i].y-poi[j].y)*(poi[i].y-poi[j].y))/(10000.0/60);
}
}
for(int i=0;i<cnt-1;i++){
if(poi[i].kid==poi[i+1].kid){
mp[i][i+1]=mp[i+1][i]=sqrt((poi[i].x-poi[i+1].x)*(poi[i].x-poi[i+1].x)+(poi[i].y-poi[i+1].y)*(poi[i].y-poi[i+1].y))/(40000.0/60);
}
}
for(int k=0;k<cnt;k++){
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
mp[i][j]=min(mp[i][k]+mp[k][j],mp[i][j]);
}
}
}
printf("%d\n", (int)(mp[0][1]+0.5));
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <iostream>
#include <cmath>
using namespace std;
#define maxn 1000000
#define INF 0x3f3f3f3f
struct node{
int u,v,w;
int next;
}edge[maxn*3];
int head[maxn];
int dis[maxn];
int vv[maxn], lay[maxn];
int cnt,n,t,c;
void init(){
memset(head,-1,sizeof head);
memset(vv,0,sizeof(vv));
memset(dis,INF,sizeof dis);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa(){
queue<int> q;
dis[1]=0;
q.push(1);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
q.push(edge[i].v);
}
}
}
return ;
}
int main(){
int T;
int q,u,v,w;
scanf("%d", &T);
for(int s=1;s<=T;s++){
scanf("%d %d %d", &n, &t, &c);
init();
for(int i=1;i<=n;i++){
scanf("%d", &q);
lay[i]=q;
vv[q]=1;
}
for(int i = 1; i < n; i++){
if(vv[i]&&vv[i+1]){
add(n+i,n+i+1,c);
add(n+i+1,n+i,c);
}
}
for(int i = 1; i <= n; i++) {
add(n+lay[i],i,0);
if(lay[i] > 1)
add(i,n+lay[i]-1,c);
if(lay[i] < n)
add(i,n+lay[i]+1,c);
}
for(int i=0;i<t;i++){
scanf("%d %d %d", &u, &v, &w);
add(u,v,w);
add(v,u,w);
}
spfa();
if(dis[n]==INF) dis[n]=-1;
printf("Case #%d: %d\n", s, dis[n]);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f
#define maxn 10010
struct node{
int u;
int v;
int w;
int next;
}edge[maxn],uedge[maxn];
int cnt,ucnt;
int t,n;
int head[maxn],uhead[maxn];
int dis[maxn], udis[maxn];
void init(){
memset(head,0,sizeof head);
memset(dis,INF,sizeof dis);
cnt=1;
}
void add(int u, int v, int w, node edge[], int &cnt,int *head){
edge[cnt].w=w;
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa(int st,int dis[],int head[],node edge[]) {
dis[st] = 0;
queue<int>q;
q.push(st);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; i!=0; i = edge[i].next) {
int v = edge[i].v;
if (dis[v] > dis[u] + edge[i].w) {
dis[v] = dis[u] + edge[i].w;
q.push(v);
}
}
}
return;
}
int main(){
while(~scanf("%d %d", &t, &n)){
init();
int u,v,w;
for(int i=0;i<t;i++){
scanf("%d %d %d", &u, &v, &w);
add(u, v, w, edge, cnt, head);
add(v, u, w, edge, cnt, head);
}
spfa(1, dis, head, edge);
cout<<dis[n]<<endl;
}
return 0;
}
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 110
#define INF 0x3f3f3f3f
int mp[maxn][maxn];
int N,A,B;
int main(){
while(~ scanf("%d %d %d", &N, &A, &B)){
memset(mp,INF,sizeof mp);
for(int i=1;i<=N;i++){
int n,m;
scanf("%d", &n);
if(n==0) continue;
scanf("%d", &m);
mp[i][m]=0;
n--;
while(n--){
scanf("%d", &m);
mp[i][m]=min(1,mp[i][m]);
mp[m][i]=min(1,mp[m][i]);
}
}
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(mp[i][j]>mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
}
}
}
if(mp[A][B] == INF) printf("-1\n");
else printf("%d\n", mp[A][B]);
}
return 0;
}
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
#define maxn 100010
#define INF 0x3f3f3f
struct node{
int u,v,w;
int next;
}edge[maxn];
int head[maxn];
int dis[maxn];
int n,m1,m2;
int cnt,B=1,E=n;
void init(){
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool spfa(int B){
dis[B]=0;
queue<int> q;
q.push(B);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
if(dis[edge[i].v]>dis[u]+edge[i].w){
dis[edge[i].v]=dis[u]+edge[i].w;
if(dis[B]<0) return true;
q.push(edge[i].v);
}
}
}
return false;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d %d %d", &n, &m1, &m2);
init();
int u,v,w;
for(int i=0;i<m1;i++){
scanf("%d %d %d", &u, &v, &w);
add(u,v,w);
add(v,u,w);
}
for(int i=0;i<m2;i++){
scanf("%d %d %d", &u, &v, &w);
add(u,v,-w);
}
if(spfa(B)) printf("YES\n");
else printf("NO\n");
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 100000
#define INF 0x3f3f3f
struct node{
int u,v,w;
int next;
}edge[maxn];
int head[maxn];
int dis[maxn];
int cnt,m,n;
bool color[maxn];
int l[maxn];
void init(){
memset(head,-1,sizeof head);
memset(dis,INF,sizeof dis);
memset(color,true,sizeof color);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa(){
queue<int> q;
q.push(0);
dis[0]=0;
while(!q.empty()){
int st=q.front();
q.pop();
for(int i=head[st];~i;i=edge[i].next){
if(dis[st]+edge[i].w<dis[edge[i].v]&&color[edge[i].v]){
dis[edge[i].v]=dis[st]+edge[i].w;
q.push(edge[i].v);
}
}
}
}
int solve(){
int ans=INF;
for(int i=1;i<=n;i++){
memset(dis,INF,sizeof dis);
memset(color,true,sizeof color);
int minle=l[i];
for(int j=1;j<=n;j++){
if(l[j]<minle||l[j]-minle>m){
color[j]=false;
}
}
spfa();
ans=min(ans,dis[1]);
}
return ans;
}
int main(){
init();
scanf("%d %d", &m, &n);
int p,x;
int t,v;
for(int i=1;i<=n;i++){
scanf("%d %d %d", &p, &l[i], &x);
add(0,i,p);
while(x--){
scanf("%d %d",&t, &v);
add(t,i,v);
}
}
printf("%d\n", solve());
return 0;
}