您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=4479

2013-04-01 11:50 281 查看
题目意思:求递增的最短路

思路,先对所有边进行排序,逐层进行算最短路

代码:

View Code

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 50001
#define N 10001
__int64 inf = 10000000000000000LL;
struct st
{
int u,v,w;
}p[M];
__int64 d
,dd[M * 5],flag
,vv[M * 5];
int n,m;
bool fan(struct st A,struct st B)
{
if(A.w < B.w)
return true;
return false;
}
void solve(int st,int en)
{
int cnt = 0;
for(int i = st;i < en;i ++)
{
int r = p[i].u,l = p[i].v,dis = p[i].w;
if(flag[r] && d[l] > d[r] + dis)
{
dd[cnt] = d[r] + dis;
vv[cnt] = l;
cnt ++;
}
if(flag[l] && d[r] > d[l] + dis)
{
dd[cnt] = d[l] + dis;
vv[cnt] = r;
cnt ++;
}
}
for(int i = 0;i < cnt;i ++)
{
d[vv[i]] = min(d[vv[i]],dd[i]);
flag[vv[i]] = 1;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t --)
{
memset(flag,0,sizeof(flag));
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;i ++) d[i] = inf;
d[1] = 0;
flag[1] = 1;
for(int i = 1;i <= m;i ++)
scanf("%d %d %d",&p[i].u,&p[i].v,&p[i].w);
sort(p + 1,p + m + 1,fan);
int i,j;
for(i = 1;i <= m;i ++)
{
for(j = i + 1;j <= m;j ++)
if(p[i].w != p[j].w)
break;
solve(i,j);
i = j - 1;
}
if(d
== inf)
printf("No answer\n");
else
printf("%I64d\n",d
);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: