dp加最短路spfa

来源:互联网 发布:linux cal命令建文件 编辑:程序博客网 时间:2024/05/16 01:59

1375: [Baltic2002]Bicriterial routing 双调路径

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 450  Solved: 161
[Submit][Status][Discuss]

Description

来越多,因此选择最佳路径是很现实的问题。城市的道路是双向的,每条道路有固定的旅行时间以及需要支付的费用。路径由连续的道路组成。总时间是各条道路旅行时间的和,总费用是各条道路所支付费用的总和。同样的出发地和目的地,如果路径A比路径B所需时间少且费用低,那么我们说路径A比路径B好。对于某条路径,如果没有其他路径比它好,那么该路径被称为最优双调路径。这样的路径可能不止一条,或者说根本不存在。 给出城市交通网的描述信息,起始点和终点城市,求最优双条路径的条数。城市不超过100个,边数不超过300,每条边上的费用和时间都不超过100。

Input

第一行给出有多少个点,多少条边,开始点及结束点. 下面的数据用于描述这个地图

Output

有多少条最优双调路径

Sample Input

4 5 1 4
2 1 2 1
3 4 3 1
2 3 1 2
3 1 1 4
2 4 2 4

Sample Output

2

HINT


Source

[Submit][Status][Discuss]


f[i][j]表示前i个城市用费用j的最小时间。
下次遇到这种题目,dp时不要狂扫,要更新了那个扔哪个。
这样做需要我们将pos和dis两个打包成一个进队。

#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define N 1201
int f[101][10001];
bool vis[101][10001];
int fir[N];int ne[N];int t[N];int c[N],to[N];
int n,m;
int ss,tt,tot;
int u,v,cc,ttt,ans=2e9;
struct what{
int pos;
int dis;
};
queue<what>q;
void add(int u,int v,int cc,int ttt)
{
t[++tot]=ttt;c[tot]=cc;to[tot]=v;ne[tot]=fir[u];fir[u]=tot;
}
int main()
{
cin>>n>>m>>ss>>tt;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>cc>>ttt;
add(u,v,cc,ttt);add(v,u,cc,ttt);
}
for(int i=1;i<=n;i++)
for(int j=0;j<=10000;j++)
{
if(i==ss&&j==0) 
{
f[i][j]=0;continue;
}
f[i][j]=2e8;
}
what st;
st.dis=0;st.pos=ss;q.push(st);
while(!q.empty())
{
what xx=q.front();
q.pop();
vis[xx.pos][xx.dis]=0;//若记录点狂扫cost的话,会T
for(int j=fir[xx.pos];j;j=ne[j])
{
int lol=to[j];
if(c[j]+xx.dis>100*n-100) continue;//注意点,要防止超边界
if(f[lol][c[j]+xx.dis]>f[xx.pos][xx.dis]+t[j])
{
f[lol][c[j]+xx.dis]=f[xx.pos][xx.dis]+t[j];
what clf;clf.pos=lol;clf.dis=c[j]+xx.dis;
if(!vis[lol][c[j]+xx.dis])
q.push(clf);
vis[lol][c[j]+xx.dis]=1;
}
}
}
int yy=0;
for(int i=0;i<=100*n-100;i++)
{
if(f[tt][i]!=2e8)
if(f[tt][i]<ans)
{
ans=f[tt][i];
yy+=1;
}
}
cout<<yy<<endl;
return 0;

}