畅通工程续Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 69860 Accepted Submission(s): 27006 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
Input 本题目包含多组数据,请处理到文件结束。
Output 对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
Sample Output 2 -1
Author linle
Source |
坑在这,
3 4
0 1 5
0 1 1
0 2 3
1 2 1
0 2
4 5
0 4 3
0 4 5
0 4 6
0 4 1
0 4 48
0 4
这两组数据能通过就ok了
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[201],map[201][201],low[201],pre[201];
struct kk
{
int s,e,w;
}s[1001];
int DJS(int ve,int e,int n)
{
bool v[201];
int i,j;
for(i=1;i<=n;i++)
{
low[i]=map[ve][i];
v[i]=false;
if(low[i]==0x3f3f3f3f)
pre[i]=-1;
else
pre[i]=ve;
}
low[ve]=0;
v[ve]=true;
for(i=2;i<=n;i++)
{
int min=0x3f3f3f3f,pos=ve;
for(j=1;j<=n;j++)
{
if(!v[j]&&low[j]<min)
{
min=low[j];
pos=j;
}
}
v[pos]=true;
for(j=1;j<=n;j++)
{
if(!v[j]&&map[pos][j]<0x3f3f3f3f)
{
if(low[pos]+map[pos][j]<low[j])
{
low[j]=low[pos]+map[pos][j];
pre[j]=pos;
}
}
}
}
//for(i=1;i<=n;i++)
//cout<<low[i]<<" ";
//cout<<endl;
if(low[e]!=0x3f3f3f3f)
return low[e];
else
return -1;
}
int main()
{
int n,m,i,j,t,k,v0,ve;
while(~scanf("%d%d",&n,&m))
{
memset(map,0x3f3f3f3f,sizeof(map));
memset(s,0x3f3f3f3f,sizeof(s));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&s[i].s,&s[i].e,&s[i].w);
if(s[i].w<map[s[i].s+1][s[i].e+1])
{
map[s[i].s+1][s[i].e+1]=map[s[i].e+1][s[i].s+1]=s[i].w;
}
}
scanf("%d%d",&v0,&ve);
/*for(i=1;i<=n+1;i++)
{
for(j=1;j<=n+1;j++)
{
cout<<map[i][j]<<'\t';
}
cout<<endl;
}*/
cout<<DJS(v0+1,ve+1,n+1)<<endl;
}
return 0;
}