AOJ 0117 - A reward for a Carpenter
ワーシャルフロイド法を初めて解いた.
#include <iostream> #include <cstdio> #include <algorithm> const int MAX_N = 20, INF = 500000; int dis[MAX_N+1][MAX_N+1]; //V 頂点数 from 始点 to 終点 int wfloyd(int V, int from, int to){ for(int k=0;k<=V;k++){ for(int i=0;i<=V;i++){ for(int j=0;j<=V;j++)dis[i][j] = std::min(dis[i][j], dis[i][k] + dis[k][j]); } } return dis[from][to]; } int main(){ //Initialization for(int i=0;i<MAX_N+1;i++){ for(int j=0;j<MAX_N+1;j++){ dis[i][j] = INF; } } //Input int n, m;//街の数,道の数 std::cin >> n >> m; for(int i=0;i<m;i++){ int a, b, c, d; scanf("%d,%d,%d,%d",&a,&b,&c,&d); dis[a][b] = c; dis[b][a] = d; } int x1, x2, y1, y2; scanf("%d,%d,%d,%d",&x1,&x2,&y1,&y2); //Processing int lowest = wfloyd(n,x1,x2) + wfloyd(n,x2,x1), res = y1 - y2 - lowest; std::cout << res << std::endl; return 0; }