HDU 1595 找到最短路径中去掉其中一条边之后的最大长度
这题关键是要记录最短路径的每一条路
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1100
struct ln{
int u,v;
}road[N];
#define inf 99999999
int used[N],dis[N],g[N][N],m,n,pre[N];//pre记录
void dij(int s)
{
int i,j;
memset(used,0,sizeof(used));
memset(pre,-1,sizeof(pre));
for(i=1;i<=n;i++)
dis[i]=g[i][s];
used[s]=1;
for(i=1;i<n;i++)
{
int min=inf,tep=-1;
for(j=1;j<=n;j++)
if(min>dis[j]&&!used[j])
min=dis[tep=j];
if(tep==-1)
break;
used[tep]=1;
for(j=1;j<=n;j++)
if(!used[j]&&dis[j]>dis[tep]+g[j][tep])
{
dis[j]=dis[tep]+g[j][tep];
pre[j]=tep;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,a,b,c;
int end=n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(j==i)
g[i][j]=0;
else
g[i][j]=inf;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(g[a][b]>c)
g[a][b]=g[b][a]=c;
}
dij(1);
i=0;
while(pre[end]!=-1)
{
road[++i].v=end;
road[i].u=pre[end];
end=pre[end];
}
road[++i].v=end;
road[i].u=1;
int min1=dis[n];
for(j=1;j<=i;j++)
{
int cost=g[road[j].u][road[j].v];//备份
g[road[j].u][road[j].v]=g[road[j].v][road[j].u]=inf;
dij(1);
if(dis[n]>min1&&dis[n]<inf)
min1=dis[n];
g[road[j].u][road[j].v]=g[road[j].v][road[j].u]=cost;
}
printf("%d\n",min1);
}
return 0;
}
Hdoj 1385 最短路径记录 floyd
path[i][j] 中存的是i到j路径的第2个点, 比如1->2->3, path[1][3]存的是2, path[2][3] = 3;
#include<stdio.h>
#include<string.h>
#define inf 99999999
int a[201][201];
int path[201][201];
int b[201],n;
void init()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
path[i][j]=j//记录从i到j的j;
}
int main()
{
while(scanf("%d",&n),n)
{
int i,j,c,d,k,x;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==-1)
a[i][j]=inf;
}
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
init();
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j]+b[k])
{
a[i][j]=a[i][k]+a[k][j]+b[k];
path[i][j]=path[i][k];
}
else if(a[i][j]==a[i][k]+a[k][j]+b[k]&&path[i][j]>path[i][k])
{
path[i][j]=path[i][k];
}
}
while(scanf("%d%d",&c,&d)==2)
{
if(c==-1&&d==-1)
break;
printf("From %d to %d :\n",c,d);
printf("Path: ");
x=c;
printf("%d",c);
while(x!=d)
{
printf("-->%d",path[x][d]);
x=path[x][d];
}
printf("\nTotal cost : %d\n\n",a[c][d]);
}
}
return 0;
}