sgu 185 最短路 最大流

2021-05-27 17:48:50 字數 1273 閱讀 4724

題意:求兩條不公邊的最短路,存在則輸出兩條路徑,不存在則輸出no solution

經過無數的re 22,wa 20和mel終於用最短路+最大流給a啦,感謝蒼天的解救啊!剛開始用的費用流解決:建圖源點到1建一條容量為2,費用為0的邊,n到匯點連一條容量為2,費用為0的邊,原圖中的邊(u,v)容量為1,費用為u--v的距離,這樣建圖之後,求最小費用最大流就可以判斷出是否存在路徑(當最大流為2,且c[0]==c[1]時存在滿足題意的路徑,c中存放的是第一次和第二次的最短路徑的長度),用該方法開始一直wa 20 (是因為找路徑的時候找錯了,注意這裡滿足條件的路徑應為費用為正,流量為0),後面就一直re 22至今未解決,老火!!!!! 後面棄暗投明用最短路+最大流給a啦,建圖的方法先求出1到所有點的最短路徑,然後滿足dist[u]+g[u][v]==dist[v]的建邊(這樣建邊使得可能在最短路上的邊都在新圖中),權值為1,這樣建圖後求最大流,若最大流》=2則表明存在這樣的兩條路徑,否則直接輸出solution! 

注意用最大流是找路徑的時候不應該滿足條件的邊不應該只是權值為0的邊,還應該加上該邊是非逆向邊,因為有的逆向邊的權值也為0

**:

#include#include#includeusing namespace std;

const short n = 410;

const int inf = 0xfffffff;

const int e = 170000;

short g[n][n];

int dist[n];

int e,head[n];

int dep[n],que[n],cur[n],n;

bool tag;

struct node

edge[e];

void addedge(int u,int v,int c)

int maxflow(int s,int t)

} if(dep[t]==-1)

break;

memcpy(cur,head,sizeof(head));

for(i=s,top=0;;)

for(k=0;kdist[u]+g[u][j])

}} vis[u]=false; }}

void output(short u)

for(int i = head[u];i!=-1;i=edge[i].nxt) }

}int main()

else printf("no solution\n");

} return 0;

}

hdu 3599 最短路 最大流)

思路 首先spfa求一下最短路,然後對於滿足最短路上的邊 dist v dist u w 加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。1 include2 include3 include 4 include5 include6 include7 using name...

hdu3416 最短路 最大流

最短路 最大流 用spfa算出 s到各個點的最短路 t到各個點的最短路 if dis1 i dis2 i map i j dis1 t 滿足這種情況說明邊在最短路上,所以根據這個方法建邊 然後最大流解決 這道題很值得體會體會 this code is made by linmeichen probl...

HDU5294 最短路,最大流

題意是給乙個n點m邊的無向圖,求最少去掉多少邊使得最短路不存在,和最短路存在的情況下最多去掉多少邊。把所有最短路上的邊搞進來,流量為1跑最大流,去掉多少邊只要搞個dp就能找到最短路圖上得最短的路,用m去減就行。因為n 2000,n 2複雜度隨便搞都行。坑點是有重邊。include include i...