Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 24398 | Accepted: 6472 |
Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
题目大意:
有n个城市,m条路,从1走到n的道路的最大承载量,最大承载量就是走过的路的承载量的最小值。呵呵呵~~~再次举个栗子:假设n=3,m=3,连接1与2的城市的路的承载量为3,连接1与3的承载量是4,连接2与3的承载量是5,那么从1到3有2种走法:(1)1-2-3,承载量依次是3,5,那么最大承载量就是5;(2)1-3,承载量是4,最大承载量也是4,所以答案是4。参考代码:
/* 二分+并查集 Memory: 1288 KB Time: 250 MS Language: G++ Result: Accepted */ #include<map> #include<stack> #include<queue> #include<cmath> #include<vector> #include<cctype> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const double eps=1e-10; const int INF=0x3f3f3f3f; const int MAXN=1100; int n,m,par[MAXN],s[MAXN*MAXN],e[MAXN*MAXN],cost[MAXN*MAXN]; int find(int x) { return x==par[x]?x:par[x]=find(par[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return; par[x]=y; } bool judge(int x) { for(int i=1;i<=n;i++) par[i]=i; for(int i=1;i<=m;i++) if(cost[i]>=x) unite(s[i],e[i]); return find(1)==find(n); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int tcase,f=0; scanf("%d",&tcase); while(tcase--) { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&s[i],&e[i],&cost[i]); int l=1,r=1e6+50; while(l<r) { int mid=(l+r)/2; if(judge(mid)) l=mid+1; else r=mid; } printf("Scenario #%d:\n%d\n\n",++f,r-1); } return 0; }
/* 最大生成树 Memory: 14904 KB Time: 454 MS Language: G++ Result: Accepted */ #include<map> #include<stack> #include<queue> #include<cmath> #include<vector> #include<cctype> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const double eps=1e-10; const int INF=0x3f3f3f3f; const int MAXN=1100; struct edge { int s,e,v; bool operator<(const edge& t)const { return v>t.v; } }; edge e[MAXN*MAXN]; int n,m,par[MAXN],ans; int find(int x) { return x==par[x]?x:par[x]=find(par[x]); } bool unite(int x,int y) { x=find(x); y=find(y); if(x==y) return false; par[x]=y; return true; } bool same(int x,int y) { return find(x)==find(y); } void kruskal() { sort(e+1,e+1+m); for(int i=1; i<=m; i++) { if(!same(e[i].s,e[i].e)) { unite(e[i].s,e[i].e); ans=min(ans,e[i].v); if(same(1,n)) break; } } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int tcase,f=0; scanf("%d",&tcase); while(tcase--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) par[i]=i; memset(e,0,sizeof(e)); for(int i=1; i<=m; i++) scanf("%d%d%d",&e[i].s,&e[i].e,&e[i].v); ans=INF; kruskal(); printf("Scenario #%d:\n%d\n\n",++f,ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1797 Heavy Transportation(二分+并查集/kruskal)
原文地址:http://blog.csdn.net/noooooorth/article/details/47702039