传送门:HDU4370
这题竟然是个最短路的题。。再次感受到了图论的核心是建图啊。。
我就不瞎扯了,直接上邝斌巨巨的题解吧:点击打开链接
当时自己做的时候因为专题名称是最短路,就使劲往图论上凑,然后就只想到了斌巨博客中提到的A情况。。然后一发wa,看了斌巨题解只能说不得不服啊。。
自己写了个啥优化没有的dijkstra。。
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int mp[303][303],dis[303];
int n;
void dij(int s)
{
int book[303];
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++)
{
if(i==s)
{
dis[i]=inf;
}
else
{
dis[i]=mp[s][i];
}
}
int cnt=1;
while(cnt<n)
{
int mmin=inf,k;
for(int i=1;i<=n;i++)
{
if(!book[i]&&dis[i]<mmin)
{
mmin=dis[i];
k=i;
}
}
book[k]=1;
for(int i=1;i<=n;i++)
{
if(!book[i]&&dis[i]>dis[k]+mp[k][i])
{
dis[i]=dis[k]+mp[k][i];
}
}
cnt++;
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mp[i][j]);
dij(1);
int p=dis[n],huan1=dis[1];
dij(n);
int huan2=dis[n];
printf("%d\n",min(p,huan1+huan2));
}
return 0;
}