在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入保证至少存在1条商店到赛场的路线。
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
3 2
自己写了dj还有flod 可是比赛的啥都没有过,有一点小难受还有一点反感自己不知道是不是应该继续动摇了好多
dj是因为 inf弄小了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int road[105][105];
int dp[105];
int book[105];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
int a,b,c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)road[i][j]=0;
else road[i][j]=inf;
memset(dp,0,sizeof(dp));
memset(book,0,sizeof(book));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<road[a][b])
{
road[a][b]=c;
road[b][a]=c;
}
}//ÊäÈëÍê³É
for(int i=1;i<=n;i++)
dp[i]=road[1][i];
int u;
for(int i=1;i<=n;i++)
{
int min=inf;
for(int j=1;j<=n;j++)
{
if(dp[j]<min&&book[j]==0)
{
min=dp[j];
u=j;
}
}
book[u]=1;
for(int j=1;j<=n;j++)
{
if((dp[u]+road[u][j])<dp[j])
dp[j]=dp[u]+road[u][j];
}
}
printf("%d\n",dp[n]);
}
return 0;
}
还有一个flod 这个忘记是双向的了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int road[105][105];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
int a,b,c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
road[i][j]=0;
else
road[i][j]=inf;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<road[a][b])
{
road[a][b]=c;
road[b][a]=c;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(road[i][j]+road[j][k]<road[i][k])
{
road[i][k]=road[i][j]+road[j][k];
road[k][i]=road[i][j]+road[j][k];
}
}
printf("%d\n",road[1][n]);
}
return 0;
}