poj 3463 Sightseeing 最短路径数量
来源:互联网 发布:sql的链接服务器 编辑:程序博客网 时间:2024/05/16 11:08
题意:
求有向图中最短路和比最短路大1的路径数量。
思路:
需要理解dijkstra算法中dis[n]数组的含义,设cnt[i]表示到点i的最短路径数量,cnt1[i]表示到点i比最短路大1的路径数量。在运行dijkstra算法的过程中每次获得最小dis[i]的时候可以对所有dis[v]+w(v,i)==dis[i]的v做如下更新cnt[i]+=cnt[v],cnt1[i]+=cnt1[v]。而当所有值为某数的dis[i]计算完成时也就是对任意i,dis[i]为同一值且不再变化时,可以对这些满足dis[i]+1=dis[v]+w(v,i)的点i做如下更新:cnt1[i]+=cnt[v];最后结果为cnt[f]+cnt1[f]。
//poj 3463//sepNINE#include <iostream>#include <queue>using namespace std;const int maxN=1024;const int maxM=10024;int head[maxN];int head1[maxN];int dis[maxN];int cnt[maxN];int cnt1[maxN];int n,m,e,e1,s,f;typedef pair<int,int> pii;priority_queue<pii,vector<pii>,greater<pii> > q;struct Edge{int v,w,next;}edge[maxM],edge1[maxM];void update(int maxDis){int i;for(int i=1;i<=n;++i){if(dis[i]==maxDis){for(int e=head1[i];e!=-1;e=edge1[e].next){int v=edge1[e].v,w=edge1[e].w;if(dis[v]+w==dis[i]+1)cnt1[i]+=cnt[v];}}}}int dij(int s,int t){memset(cnt,0,sizeof(cnt));memset(cnt1,0,sizeof(cnt1));int i,maxDis;for(i=1;i<=n;++i)dis[i]=INT_MAX;dis[s]=0;cnt[s]=1;maxDis=0;q.push(make_pair(dis[s],s));while(!q.empty()){pii u=q.top();q.pop();int x=u.second;if(u.first>dis[x])continue;if(maxDis<dis[x]){update(maxDis);maxDis=dis[x];}for(int e=head1[x];e!=-1;e=edge1[e].next){int v=edge1[e].v,w=edge[e].w;if(dis[v]+w==dis[x]){cnt[x]+=cnt[v];cnt1[x]+=cnt1[v];}}for(int e=head[x];e!=-1;e=edge[e].next)if(dis[x]+edge[e].w<dis[edge[e].v]){dis[edge[e].v]=dis[x]+edge[e].w;q.push(make_pair(dis[edge[e].v],edge[e].v));}}update(maxDis);return dis[t];}int main(){int cases;scanf("%d", &cases);while(cases--){memset(head,-1,sizeof(head));memset(head1,-1,sizeof(head1));e=e1=0;scanf("%d%d",&n,&m);while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);edge[e].v=b;edge[e].w=c;edge[e].next=head[a];head[a]=e++;edge1[e1].v=a;edge1[e1].w=c;edge1[e1].next=head1[b];head1[b]=e1++;}scanf("%d%d",&s,&f);dij(s,f);printf("%d\n",cnt[f]+cnt1[f]);}return 0;}
代码:
0 0
- poj 3463 Sightseeing 最短路径数量
- POJ 最短路径
- HDU 1142 最短路径的数量
- poj 3463 计算最短与次短路径数
- POJ 3463 Sightseeing Dijkstra最短路&最短路-1的路径数(计数)
- poj 最短路径 汇总
- POJ 3259 最短路径
- poj 1125 最短路径
- 【最短路径】poj 2387
- 【最短路径】poj 1062
- 最短路径__Wormholes( Poj )
- 最短路径__Candies ( Poj )
- poj 2253(最短路径)
- 最短路径-POJ-2387
- POJ 3463 Sightseeing 最短路+次短路
- poj 1734 Sightseeing trip_ 最小环记录路径
- POJ 1734 Sightseeing trip (Floyd 最小环+记录路径)
- POJ 1734 Sightseeing trip【floyd求最小环+记录路径】
- 【Leetcode】Minimum Depth of Binary Tree (Tree Judge)
- 第十一周项目6-回文、素数(输出1000以内所有回文素数)
- MyEclipse中修改jsp页面编码
- GC的一些小点
- 多边形面积[nyoj 1011,hdu 2036]
- poj 3463 Sightseeing 最短路径数量
- android开发新手开发环境建立遇到的那些事
- 第十一周项目六 (1+)输出1000内所有素数
- Java基础笔记-第十五记
- Android.mk高级写法
- 高手速成android开源项目【View篇】
- HHVM安装使用教程
- 第十一周项目6-回文、素数(输出10000以内的可逆素数)
- lower_bound函数的使用