惭愧啊,这个题目在那天的模拟赛中竟然没有搞出来T T,学的floyd竟然白学了,看完题解才恍然大悟。。。。。。。。还有少写一个else ,让我TLE了半天
题目是一个动态图,不断的给点做上标记,然后用floyd的办法去更新节点就可以了,当点被做上标记的时候,去更新其他的节点就可以了。那么容易的办法,竟然没有想出来。。。太弱了。。。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std ;
#define INF 1000000000
#define MAXN 305
int N ;
int M ;
int Q ;
int dist[MAXN][MAXN] ;
bool mark[MAXN] ;
int inline min(int x , int y){
return x > y ? y : x ;
}
void init(){
for(int i = 0 ; i < N ; i ++){
for(int j = 0 ; j < N ; j ++){
dist[i][j] = INF ;
}
dist[i][i] = 0 ;
mark[i] = 0 ;
}
}
void addVertex(int x){
for(int i = 0 ; i < N ; i ++){
for(int j = 0 ; j < N ; j ++){
dist[i][j] = min(dist[i][j] , dist[i][x] + dist[x][j] ) ;
}
}
}
int main(){
int Case ;
Case = 0 ;
while(1){
scanf("%d%d%d" , &N , &M , &Q) ;
if(N == 0 && M == 0 && Q == 0)
break ;
init() ;
int x ;
int y ;
int z ;
for(int i = 0 ; i < M ; i ++){
scanf("%d%d%d" , &x , &y , &z) ;
if(dist[x][y] > z)
dist[x][y] = z ;
}
if(Case)
printf("\n") ;
printf("Case %d:\n" , ++ Case) ;
for(int i = 0 ; i < Q ; i ++){
scanf("%d" , &x) ;
if(x == 0){
scanf("%d" , &y) ;
if(mark[y]){
printf("ERROR! At point %d\n" , y) ;
}
else{
mark[y] = 1 ;
addVertex(y);
}
}
else{
scanf("%d%d" , &y , &z) ;
if(!mark[y] || !mark[z] ){
printf("ERROR! At path %d to %d\n" , y , z ) ;
}
else{
if(dist[y][z] >= INF)
printf("No such path\n") ;
else{
printf("%d\n" , dist[y][z]) ;
}
}
}
}
}
return 0 ;
}