題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
把與家相鄰的地方與N+1相連,邊長爲0
把想到的地方與N+2相連,邊長爲0
N爲所出現的數字的Max
刷N+1到N+2的最短路,單源最短路刷Dijkstra
貼代碼
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1005;
int g[maxn][maxn];
int d[maxn];
bool vis[maxn];
int main(){
// freopen("2066.in","r",stdin);
// freopen("2066.out","w",stdout);
int T,S,D;
while (scanf("%d%d%d",&T,&S,&D)!=EOF){
memset(g,0x3f,sizeof(g));
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
int N=0;
while (T--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if (z<g[x][y])g[x][y]=g[y][x]=z;
N=x>N?x:N;
N=y>N?y:N;
}
for (int i=1;i<=N+2;i++)g[i][i]=0;
while (S--){
int x;
scanf("%d",&x);
g[x][N+1]=g[N+1][x]=0;
}
while (D--){
int x;
scanf("%d",&x);
g[x][N+2]=g[N+2][x]=0;
}
d[N+1]=0;
int min,k;
for (int i=1;i<=N+1;i++){
min=d[0];k=0;
for (int j=1;j<=N+2;j++)
if ((!vis[j])&&(d[j]<min))k=j,min=d[j];
vis[k]=1;
for (int j=1;j<=N+2;j++)
if (d[k]+g[k][j]<d[j])d[j]=d[k]+g[k][j];
}
printf("%d\n",d[N+2]);
}
return 0;
}
【寫的有漏洞的,歡迎路過大神吐槽】
2017/07/24 23:31:27
Ending.