Go: // Warshall–Floyd Algorithm

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var scanner = bufio.NewScanner(os.Stdin)

const INF = 2000000000

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		n, _ := strconv.Atoi(buf[0])
		m, _ := strconv.Atoi(buf[1])
		if n == 0 && m == 0 {
			break
		}
		c_matrix := make([][]int, m)
		for i := range c_matrix {
			c_matrix[i] = make([]int, m)
		}
		t_matrix := make([][]int, m)
		for i := range t_matrix {
			t_matrix[i] = make([]int, m)
		}
		for i := 0; i < n; i++ {
			scanner.Scan()
			buf_ := strings.Split(scanner.Text(), " ")
			a, _ := strconv.Atoi(buf_[0])
			b, _ := strconv.Atoi(buf_[1])
			c, _ := strconv.Atoi(buf_[2])
			t, _ := strconv.Atoi(buf_[3])
			c_matrix[a-1][b-1] = c
			t_matrix[a-1][b-1] = t
		}
		c_dist := make([][]int, m)
		c_prev := make([][]int, m)
		t_dist := make([][]int, m)
		t_prev := make([][]int, m)
		for i := 0; i < m; i++ {
			c_dist[i] = make([]int, m)
			c_prev[i] = make([]int, m)
			t_dist[i] = make([]int, m)
			t_prev[i] = make([]int, m)
		}
		for i := 0; i < m; i++ {
			for j := 0; j < m; j++ {
				if c_matrix[i][j] == 0 {
					c_dist[i][j] = INF
					c_prev[i][j] = -1
				} else {
					c_dist[i][j] = c_matrix[i][j]
					c_prev[i][j] = i
				}
				if t_matrix[i][j] == 0 {
					t_dist[i][j] = INF
					t_prev[i][j] = -1
				} else {
					t_dist[i][j] = t_matrix[i][j]
					t_prev[i][j] = i
				}
			}
			c_dist[i][i] = 0
			t_dist[i][i] = 0
		}
		for k := 0; k < m; k++ {
			for i := 0; i < m; i++ {
				for j := 0; j < m; j++ {
					c_newlen := c_dist[i][k] + c_dist[k][j]
					if c_newlen < c_dist[i][j] {
						c_dist[i][j] = c_newlen
						c_prev[i][j] = c_prev[k][j]
					}
				}
			}
		}
		for k := 0; k < m; k++ {
			for i := 0; i < m; i++ {
				for j := 0; j < m; j++ {
					t_newlen := t_dist[i][k] + t_dist[k][j]
					if t_newlen < t_dist[i][j] {
						t_dist[i][j] = t_newlen
						t_prev[i][j] = t_prev[k][j]
					}

				}
			}
		}
		scanner.Scan()
		k, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < k; i++ {
			scanner.Scan()
			buf_ := strings.Split(scanner.Text(), " ")
			p, _ := strconv.Atoi(buf_[0])
			q, _ := strconv.Atoi(buf_[1])
			r, _ := strconv.Atoi(buf_[2])
			switch r {
			case 0:
				fmt.Println(c_dist[p-1][q-1])
			case 1:
				fmt.Println(t_dist[p-1][q-1])
			}
		}
	}
}

C++: #include<bits/stdc++.h>
using namespace std;
#define INF 1<<29
int V;
vector<vector<vector<int> > > G;
int d[101];
bool used[101];

void dijkstra(int s,int r){
  memset(used,false,sizeof(used));
  fill(d,d+101,INF);
  d[s]=0;
  while(1){
    int id=-1;
    for(int i=1;i<=V;++i)
      if(!used[i] && (id==-1||d[id]>d[i]))
        id=i;
    if(id==-1) break;
    used[id]=true;
    for(int i=1;i<=V;++i)
      if(r)
        d[i]=min(d[i],d[id]+G[id][i][1]);
      else
        d[i]=min(d[i],d[id]+G[id][i][0]);
  }
}
int main(){
  int n;
  while(cin>>n>>V,n){
    G=vector<vector<vector<int> > >(V+1,vector<vector<int> >(V+1,vector<int>(2,INF)));
    for(int i=0;i<n;++i){
      int a,b,c,t; cin>>a>>b>>c>>t;
      G[a][b][0]=G[b][a][0]=c;
      G[a][b][1]=G[b][a][1]=t;
    }
    int k; cin>>k;
    for(int i=0;i<k;++i){
      int p,q,r; cin>>p>>q>>r;
      dijkstra(p,r);
      cout<<d[q]<<endl;
    }
    
  }
  
  return 0;
}

C++: #include <iostream>
#include <queue>
using namespace std;
struct Line{
	int a;
	int b;
	int cost;
	int time;
};
int Min(int x,int y){
	return x<y?x:y;
}
#define Max 2000000000
int main(){
	int N,M;
	while(true){
		Line lines[3000];
		cin >> N >>M;
		if(N+M==0)	break;
		for(int i=0 ; i<N ; i++ ){
			cin >> lines[i].a >> lines[i].b ;
			cin >> lines[i].cost >> lines[i].time;
		}
		int K;
		cin >> K;
		for(int i=0 ; i<K ; i++ ){
			int to,from,r;
			cin >> from >> to>>r;
			queue <int> circle;
			circle.push(from);
			int dp[3000];
			for(int i=0 ; i<=M ; i++ )
				dp[i]=Max;
			dp[from]=0;
			while(circle.size()!=0){
				int now=circle.front();
				for(int i=0 ; i<N ; i++ ){
					if(now==lines[i].a){
						int next=lines[i].b;
						if(!r)
							dp[next]=Min(dp[next],dp[now]+lines[i].cost);
						else
							dp[next]=Min(dp[next],dp[now]+lines[i].time);
						circle.push(lines[i].b);
					}
				}
				circle.pop();
			}
			cout << dp[to] << endl;
		}
	}
	return 0;
}

C++: #include<stdio.h>
#include<algorithm>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <iostream>
#include <functional>
#include <time.h>
using namespace std;
clock_t fi, endtime;

const int INF = 100*6001;
const int r_c = 0;
const int r_t = 1;
const int MAX_V = 100;
const int MAX_E = 6000;

int main()
{
	while (1) {
		int n, m, a, b, c, t;
		int k, p, q, r;

		int wft[MAX_V][MAX_V];
		int wfc[MAX_V][MAX_V];

		scanf("%d %d", &n, &m);
		if (n == 0 && m == 0) break;
		for (int i = 0; i < m; ++i) {
			for (int j = 0; j < m; ++j) {
				wfc[i][j] = INF; wft[i][j] = INF;
			}
		}
		for (int i = 0; i < n; ++i) {
			scanf("%d %d %d %d", &a, &b, &c, &t);
			wft[a - 1][b - 1] = t;  wft[b - 1][a - 1] = t;
			wfc[a - 1][b - 1] = c;  wfc[b - 1][a - 1] = c;
		}
		for (int l = 0; l < m; ++l) {
			for (int i = 0; i < m; ++i) {
				for (int j = 0; j < m; ++j) {
					if (wft[i][j] > wft[i][l] + wft[l][j]) { wft[i][j] = wft[i][l] + wft[l][j]; }
					if (wfc[i][j] > wfc[i][l] + wfc[l][j]) { wfc[i][j] = wfc[i][l] + wfc[l][j]; }
				}
			}
		}
		scanf("%d", &k);
		int ans = 0;
		for (int i = 0; i < k; ++i) {
			scanf("%d %d %d", &p, &q, &r);
			if (r == 0) { ans = wfc[p - 1][q - 1]; }
			else { ans = wft[p - 1][q - 1]; }
			printf("%d\n", ans);
		}
	}
}

C++: #include<iostream>
#define INF 100000000
using namespace std;
int min(int a,int b){
  return a<b?a:b;
}
int main(){
  int n,m;
  while(cin>>n>>m){
    if(n==0&&m==0) break;
    int d0[m+1][m+1],d1[m+1][m+1];
    for(int i=1;i<=m;i++){
      for(int j=1;j<=m;j++){
	d0[i][j] = INF;
	d1[i][j] = INF;
      }
    }
    int a,b,cost,time;
    for(int i=0;i<n;i++){
      cin >> a >> b >> cost >> time;
      d0[a][b] = cost;
      d0[b][a] = cost;
      d1[a][b] = time;
      d1[b][a] = time;
    }
    for(int i=1;i<=m;i++){
      for(int j=1;j<=m;j++){
	for(int k=1;k<=m;k++){
	  d0[j][k] = min(d0[j][k],d0[j][i]+d0[i][k]);
	  d1[j][k] = min(d1[j][k],d1[j][i]+d1[i][k]);
	}
      }
    }
    int s,p,q,r; 
    cin >> s;
    for(int i=0;i<s;i++){
      cin >> p >> q >> r;
      if(r==0) cout << d0[p][q] << endl;
      else cout << d1[p][q] << endl;
    }
  }
  return 0;
}

C++: #include<cstdio>
#include<cstring>
#include<algorithm>
#include<functional>
#include<iostream>
#include<queue>
#define rep(i,a,b) for(i=a;i<b;i++)
#define F1 first.first
#define F2 first.second
#define F3 second
#define INF 2100000000
#define long long int int
using namespace std;
typedef pair<pair<int,int>,int> P1;
typedef pair<int,int> P2;
int main(void)
{
	priority_queue<P2,vector<P2>,greater<P2> > que;
	int i,j,k,n,m,x,s,e;
	int a,b,cos,tim,st,en,way;
	int leng[1001],kami[1002];
	P1 glid1[6000],glid2[6000];
	P2 tori;
	while(1) {
		cin>>n>>m;
		if(n==0&&m==0) break;
		rep(i,0,n) {
			cin>>a>>b>>cos>>tim;
			glid1[i*2].F1=a,glid1[i*2].F2=b,glid1[i*2].F3=cos;
			glid2[i*2].F1=a,glid2[i*2].F2=b,glid2[i*2].F3=tim;
			glid1[i*2+1].F1=b,glid1[i*2+1].F2=a,glid1[i*2+1].F3=cos;
			glid2[i*2+1].F1=b,glid2[i*2+1].F2=a,glid2[i*2+1].F3=tim;
		}
		sort(glid1,glid1+n*2);sort(glid2,glid2+n*2);
		kami[1]=0;
		rep(i,1,n*2) {
			if(glid1[i].F1!=glid1[i-1].F1) {
				x=glid1[i].F1;
				kami[x]=i;
			}
		}
		kami[m+1]=n*2;
		
		cin>>k;
		rep(i,0,k) {
			cin>>st>>en>>way;
			for(j=1;j<=m;j++) leng[j]=INF;
			while(!que.empty()) que.pop();
			que.push(P2(0,st));
			while(!que.empty()) {
				tori=que.top(),que.pop();
				a=tori.first,b=tori.second;
				if(a<leng[b]) {
					leng[b]=a;
					if(b==en) break;
					s=kami[b],e=kami[b+1];
					if(way==0)rep(j,s,e) que.push(P2(a+glid1[j].F3,glid1[j].F2));
					else rep(j,s,e) que.push(P2(a+glid2[j].F3,glid2[j].F2));
				}
			}
			cout<<leng[en]<<endl;
		}
	}
	return 0;
}