zoj(Conference Call)

来源:互联网 发布:编程猫 编辑:程序博客网 时间:2024/06/05 18:36

连接3点的最短路!!!关键是枚举找到连接3

点的中间一点!!!(可以推广到n点的最短路)

#include<iostream>
#include<string.h>
#include<stdio.h>
#define INF 100000000
using namespace std;
int n,m,I;
int mat[505][505];
int v[505];
int dx[505],dy[505],dz[505];
int t[10005];
void dijkstral(int u, int *d){
memset(v, 0, sizeof(v));
for(int i = 1; i <=m; i++) d[i] = (i==u ? 0 : INF);
for(int i = 1; i <= m; i++) {
int x, g = INF;
for(int y = 1; y <=m; y++) if(!v[y] && d[y]<=g) g= d[x=y];
v[x] = 1;
for(int y =1; y <=m; y++) if(d[y]>d[x]+mat[x][y]) d[y]=d[x]+mat[x][y];
}
   
}

int main(){
int k=1;
while(cin>>n>>m>>I){
for(int i=1;i<=n;i++) cin>>t[i];
int a,b,c;
 for(int i = 1; i <=m; i++)
for(int j = 1; j <=m; j++)
mat[i][j] = INF;
for(int i=1;i<=I;i++){ cin>>a>>b>>c;mat[a][b]=mat[b][a]=c;}
int q;
cin>>q;
printf("Case #%d/n",k);
int x,y,z;
for(int i=1;i<=q;i++){
cin>>x>>y>>z;
int dxy,dxz,dyz;
dijkstral(t[x],dx);
/ y=d[t[y]];
/ z=d[t[z]];
dijkstral(t[y],dy);
/ z=d[t[z]];
dijkstral(t[z],dz);
/*int temp=dxy+dyz;
if(dxy+dxz<temp) temp=dxy+dxz;
if(dxz+dyz<temp) temp=dxz+dyz;  */
int temp=INF;
for(int k=1;k<=m;k++) if(dx[k]+dy[k]+dz[k]<temp) temp=dx[k]+dy[k]+dz[k];

if(temp>=INF) printf("Line %d: Impossible to connect!/n",i);
else printf("Line %d: The minimum cost for this line is %d./n",i,temp);
}

 

k++;
}


return 0;}