求边最少最短路
求最短路构成的边权为1的图的最大流
两个 模板
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;
#define maxn 2100
#define INF 0x7f7f7f7f
struct Edge {
int from,to,cap,flow;
};
int eid;
int nod[maxn];
vector<pair<int,int >>ee[maxn];
bool in[maxn];
int dis[maxn];
int cnt[maxn];
queue<int>q;
struct Dinic {
int n,m,s,t;
vector<Edge>edges;
vector<int>G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
void addEdge(int from,int to,int cap) {
edges.push_back((Edge) {from,to,cap,0});
edges.push_back((Edge) {to,from,0,0});
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
void init(){
edges.clear();
for(int i=1;i<=maxn;i++) G[i].clear();
}
bool Bfs() {
memset(vis,0,sizeof(vis));
queue<int>Q;
while(!Q.empty()) Q.pop();
Q.push(s);
d[s]=0;
vis[s] = 1;
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i=0; i<G[x].size(); i++) {
Edge& e = edges[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow) {
vis[e.to] = 1;
d[e.to] = d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x,int a) {
if(x==t||a==0) return a;
int flow = 0,f;
for(int &i=cur[x]; i<G[x].size(); i++) {
Edge& e = edges[G[x][i]];
if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0) {
e.flow += f;
edges[G[x][i]^1].flow -= f;
flow += f;
a -= f;
if(a==0) break;
}
}
return flow;
}
int maxflow(int s,int t) {
this->s=s;
this->t=t;
int flow = 0;
while(Bfs()) {
memset(cur,0,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
};
void spfa(int src,int tc)
{
memset(in,false,sizeof(in));
while(!q.empty())q.pop();
for(int i=0;i<maxn;++i)
{
dis[i]=INF;
cnt[i]=INF;
}
q.push(src);
in[src]=true;
dis[src]=0;
cnt[src]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
in[u]=false;
for(int i=0;i<(int)ee[u].size();++i)
{
int v=ee[u][i].first;
if(dis[v]==dis[u]+ee[u][i].second)cnt[v]=min(cnt[v],cnt[u]+1);
if(dis[v]>dis[u]+ee[u][i].second)
{
dis[v]=dis[u]+ee[u][i].second;
cnt[v]=cnt[u]+1;
if(!in[v])
{
q.push(v);
in[v]=true;
}
}
}
}
return;
}
int n,k;
Dinic slove;
void build_graph()
{
eid=0;
memset(nod,-1,sizeof(nod));
for(int i=1;i<=n;++i)
{
for(int j=0;j<(int)ee[i].size();++j)
{
int v=ee[i][j].first;
if(dis[i]+ee[i][j].second==dis[v])
{
slove.addEdge(i,v,1);
}
}
}
return;
}
int main(){
while(scanf("%d%d",&n,&k)==2){
slove.init();
for(int i=0;i<maxn;++i)ee[i].clear();
for(int i=0;i<k;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
ee[x].push_back(make_pair(y,z));
ee[y].push_back(make_pair(x,z));
//addEdge(x,y,1);
}
spfa(1,n);
build_graph();
printf("%d %d\n",slove.maxflow(1,n),k-cnt[n]);
}
}
版权声明:都是兄弟,请随意转载,请注明兄弟是谁
时间: 2024-09-28 15:40:55