SCU 4526 最短路

来源:互联网 发布:淘宝金牌店铺可信吗 编辑:程序博客网 时间:2024/05/21 06:27

最短路

给定一个个节点,条有向边的图,再给你起点和终点,请问其中有多少条互不重叠的从起点到终点的最短路,即互相没有公共边的最短路个数(可以有公共点),用过边的不能再用。

输入第一行有一个,表示样例个数。 
每个样例第一行有两个整数 
然后是行,代表每一条边的起点终点和权值。 
然后是一个两个整数,代表起点和终点。

输出最短路个数。


4 4 
1 2 1 
1 3 1 
2 4 1 
3 4 1 
1 4 
7 8 
1 2 1 
1 3 1 
2 4 1 
3 4 1 
4 5 1 
4 6 1 
5 7 1 
6 7 1 
1 7 
6 7 
1 2 1 
2 3 1 
1 3 3 
3 4 1 
3 5 1 
4 6 1 
5 6 1 
1 6 
2 2 
1 2 1 
1 2 2 
1 2




1

显然,网络流,和上篇一样,先跑最短路,这里用dijkstra跑,然后反向网络流

吐血的是,dijkstra里面pai<,>第一个元素应该是距离,,脑残写成了点的编号,,结果wa了7次,,

#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#include<map>#include<set>#include<stack>#include<queue>#include<string.h>#include<cstring>#include<vector>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define MX 1111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;int n,m,head[MX],rear,s,t;int vis[MX],path[MX],d[MX];int arr[MX];struct Edge {    int from,to,flow,nxt,dist;} edge[222222];void edge_init() {    rear=0;    mem(head,-1);}void edge_add(int a,int b,int dist,int c) {    edge[rear].from=a;    edge[rear].dist=dist;    edge[rear].to=b;    edge[rear].flow=c;    edge[rear].nxt=head[a];    head[a]=rear++;}void dijkstra(int s) {    mem(vis,0);    priority_queue<PII,vector<PII>,greater<PII> > my;    mem(arr,0x3f);    arr[s] = 0;    my.push(PII(0,s));    while(!my.empty()) {        PII u = my.top();        my.pop();        if(vis[u.second]) continue;        vis[u.second]=1;        for(int i = head[u.second]; ~i; i = edge[i].nxt) {            int v = edge[i].to;            if(arr[v]<=arr[u.second]+edge[i].dist||edge[i].flow) continue;            arr[v]=arr[u.second]+edge[i].dist;            my.push(PII(arr[v],v));        }    }}int EK(int s,int t) {    int ans=0;    while(1) {        mem(vis,0);        d[s]=INF;        queue<int> my;        my.push(s);        vis[s]=1;        int flag=0;        while(!my.empty()) {            int u=my.front();            my.pop();            if(u==t) {                flag=1;                break;            }            for(int i=head[u]; ~i; i=edge[i].nxt) {                int v=edge[i].to;                if(edge[i].flow==0||vis[v]||arr[u]!=arr[v]+edge[i].dist) continue;                path[v]=i;                d[v]=min(edge[i].flow,d[u]);                my.push(v);                vis[v]=1;            }        }        if(flag) {            ans+=d[t];            for(int i=t; i!=s; i=edge[path[i]].from) {                edge[path[i]].flow-=d[t];                edge[path[i]^1].flow+=d[t];            }        } else break;    }    return ans;}int main() {    FIN;    int _;    scanf("%d",&_);//    while(_--) {        scanf("%d%d",&n,&m);        edge_init();        for(int i=1; i<=m; i++) {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            edge_add(a,b,c,0);            edge_add(b,a,c,1);        }        scanf("%d%d",&s,&t);        dijkstra(s);        printf("%d\n",EK(t,s));    }    return 0;}


0 0
原创粉丝点击