n(2<=n<=200)個城市,m(1<=m<=40000)條無向邊,你要找t(1<=t<=200)條從城市1到城市n的路,使得最長的邊的長度最小,邊不能重複用。
輸入格式:
第1行三個整數n,m,t用空格隔開。
第2行到p+1行,每行包括三個整數ai,bi,li表示城市ai到城市bi之間有一條長度為li的道路。
輸出格式:
輸出只有一行,包含乙個整數,即經過的這些道路中最長的路的最小長度。
輸入樣例#1:
7 9 2
1 2 2
2 3 5
3 7 5
1 4 1
4 3 1
4 5 7
5 7 1
1 6 3
6 7 3
輸出樣例#1:
二分答案+網路流....
本來想用k長路做,然後發現每條邊只能經過1次
那麼,不就是網路流嗎,容量為1,表示做多可以跑一次
那麼具體實現,二分乙個邊權,只有當小於等於這個邊權的才能跑,容量為1,反向邊容量為0
因為是無向邊,所以每次本來應該是4條邊的,但跑的是最大流,所以容量為0的兩條邊就可以省略了,二分判斷合法的方式就是看當前最大流能不能跑滿t,t為題目輸入
#include#define lol long long
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
using namespace std;
const int n=210,m=4e4+10;
const int inf=2e9;
void in(int &ans)
while(i>='0'&&i<='9') ans=(ans<<3)+(ans<<1)+i-'0',i=getchar();
ans*=f;
}int n,m,t,cur=-1;
int l=inf,r=-inf;
int a[m],b[m],c[m];
int to[m<<1],head[n],nex[m<<1],vis[m<<1],cap[m<<1];
int lev[n];
inline void add(int a,int b,int c)
bool bfs(int s,int t)
} }
return lev[t]!=-1;
}int dfs(int s,int f,int t,int rest=0)
} }
if(!rest) lev[s]=-1;
return rest;
}bool check(int mid,int ans=0)
while(bfs(1,n))
while(int c=dfs(1,inf,n)) ans+=c;
return ans>=t;
}int main()
while(l>1;
if(check(mid)) r=mid;
else l=mid+1;
}printf("%d\n",r);
}
AC日記 城市 洛谷 P1401
n 2 n 200 個城市,m 1 m 40000 條無向邊,你要找t 1 t 200 條從城市1到城市n的路,使得最長的邊的長度最小,邊不能重複用。輸入格式 第1行三個整數n,m,t用空格隔開。第2行到p 1行,每行包括三個整數ai,bi,li表示城市ai到城市bi之間有一條長度為li的道路。輸出...
洛谷 P1453 城市環路
給出一幅有n個點,n條邊的無向聯通圖,每乙個點有乙個權,並給出乙個常數k,對其中一些點進行染色,且相鄰兩點的顏色不能都染,則最大的染色點權值和 k是多少.首先題目與k幾乎無關 最後乘上即可 僅僅比樹多了一條邊,因而只有乙個環,只要處理一下這個唯一環即可用樹形dp的思路來做.可以在這個環上找任意兩個相...
洛谷P3761 TJOI2017 城市
從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有ri座城市,1條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。小明對這個地區深入研究後,覺得這個地區的交通費用太貴。小明想徹底改造這個地區,但是由於上司給他的資源有...