题面描述:
有一n个点,m条边的双向图,每条边都有花费和流量,求从1~n的路径中,求
由于流量较小,所以可以枚举最小流量,然后跑dijkstra
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int inf=0x3f3f3f3f;
typedef pair<int,int> PII;
struct edge
{
int to,val,flow;
}tmp;
int n,m,in[maxn],dis[maxn];
vector <edge> G[maxn];
void add(int a,int b,int c,int f)
{
tmp.to=b; tmp.val=c; tmp.flow=f;
G[a].push_back(tmp);
}
void dijkstra(int x)
{
for(int i=1;i<=n;i++)
dis[i]=inf,in[i]=false;
priority_queue <PII,vector<PII>,greater<PII> > q;
q.push((PII){0,1});
while(!q.empty())
{
PII temp=q.top(); q.pop();
int num=temp.second;
int dist=temp.first;
if(in[num]) continue;
in[num]=true;
for(int k=0;k<G[num].size();k++)
{
tmp=G[num][k];
if(x>tmp.flow) continue;
int to=tmp.to;
if(dist+tmp.val<dis[to])
{
dis[to]=dist+tmp.val;
q.push((PII){dis[to],to});
}
}
}
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c,f;
scanf("%d%d%d%d",&a,&b,&c,&f);
add(a,b,c,f); add(b,a,c,f);
}
int ans=0;
for(int i=1;i<=1000;i++)
{
dijkstra(i);
if(dis[n]!=inf) ans=max(ans,i*1000000/dis[n]);
}
printf("%d",ans);
return 0;
}