题意:给定一张图,求过给定的点的最短路。
分析:floyd算法,中间节点k只取标记过的
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX_N 305
#define MAX_M 100005
#define MAX_Q 100005
#define inf 0x3f3f3f3f
using namespace std;
bool used[MAX_N];
int dp[MAX_N][MAX_N];
int n,m,q;
void warshall_floyd(int x)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
dp[i][j]=min(dp[i][j],dp[i][x]+dp[x][j]);
}
return ;
}
int main(void)
{
int t=0;
int cnt=0;
while(scanf("%d%d%d",&n,&m,&q)==3)
{
if(n==0&&m==0&&q==0)
break;
if(cnt>=1)
printf("\n");
cnt++;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
dp[i][i]=0;
else
dp[i][j]=inf;
}
}
printf("Case %d:\n",++t);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
dp[a][b]=min(dp[a][b],c);
}
for(int i=0;i<n;i++)
used[i]=false;
while(q--)
{
int op;
int x,y;
scanf("%d",&op);
if(op==0)
{
scanf("%d",&x);
if(!used[x])
{
used[x]=true;
warshall_floyd(x);
}
else
printf("ERROR! At point %d\n",x);
}
else
{
scanf("%d%d",&x,&y);
if(used[x]&&used[y])
{
// warshall_floyd();
if(dp[x][y]==inf)
printf("No such path\n");
else
printf("%d\n",dp[x][y]);
}
else
printf("ERROR! At path %d to %d\n",x,y);
}
}
}
}