您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习 R HDU 437

2016-10-14 20:00 274 查看
题目地址:https://vjudge.net/contest/66569#problem/R

思路:实现不难,难的是想不到如何转化这个模型。简直是神转换,看上去是数学题,biubiubiu就变成了图。具体题解见kuangbin大神的题解吧,Orz……

kuangbin的题解:http://www.cnblogs.com/kuangbin/archive/2012/08/17/2644557.html

AC代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=300+5;
int E[maxn][maxn];
bool vis[maxn];
int in[maxn];
int d[maxn];
int n;

void spfa(int s)
{
memset(vis,false,sizeof(vis));
memset(d,INF,sizeof(d));
memset(in,0,sizeof(in));
queue<int>q;
for(int i=1;i<=n;i++)
{
if(i==s)
continue;
d[i]=E[s][i];
vis[i]=true;
q.push(i);
}
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=false;
if(in[now]++>n)
return;
for(int i=1;i<=n;i++)
{
if(d[i]>d[now]+E[now][i])
{
d[i]=d[now]+E[now][i];
if(vis[i])
continue;
vis[i]=true;
q.push(i);
}
}
}
}

int main()
{
while(~scanf("%d",&n))
{
memset(E,0,sizeof(E));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&E[i][j]);
}
}
int ans,c1,c2;
spfa(1);
ans=d
;
c1=d[1];
spfa(n);
c2=d
;
ans=min(ans,c1+c2);
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: