2013 ACM/ICPC Asia Regional Hangzhou Online
题意: 给定n个岛和m条桥。每座桥给出连接的两个岛和桥上的士兵数。现只能炸一座桥。
若该图为强连通图则输出-1,反之求最少炸药数==桥上士兵数 。
1:有重边~一开始没考虑!!附上邻接矩阵的“WA”代码 与 邻接表的AC代码;
2:若桥上士兵数为0,也要一个炸弹,输出1;
3:若原图不连通,即多个连通子图,则不用炸弹,输出0。
邻接表AC代码
#include
#include
#include
#include
#define min(a,b) (a>b?b:a)
#define CLR(arr,x) memset(arr,x,sizeof(arr))
#define FOR(I,J) for(int i=I ; i Low[v] ? Low[v] : Low[u] ;
if( Low[v] > Dfn[u] ) {
Cost = Cost > E[e].w ? E[e].w : Cost ;
}
}
else Low[u] = Low[u] > Dfn[v] ? Dfn[v] : Low[u] ;
}
}
int main() {
int Island1 ,Island2 , People ;
while(~scanf("%d%d",&n,&m)&&(n||m)) {
Init() ;
FOR(0,m) {
scanf("%d%d%d",&Island1,&Island2,&People) ;
AddEdge(Island1, Island2,People) ;
}
Tarjan(1,-1) ;
if( Times < n ) { printf("0\n") ;}
else if( Cost == Inf) printf("-1\n") ;
else if( !Cost ) {printf("1\n") ;}
else printf("%d\n",Cost) ;
}
return 0 ;
}
邻接矩阵WA代码 ~~~
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1000+100 ;
const int Inf = 1<<30 ;
vectorMap[maxn] ;
int Val[maxn][maxn] ;
int Dfn[maxn] , Low[maxn] ;
int Fa[maxn] ;
int Nbridge , Times ;
bool Is_bridge[maxn] ,Mapp[maxn][maxn] ;
int n , m ;
void init() {
memset(Dfn,0,sizeof(Dfn)) ;
memset(Is_bridge, 0 ,sizeof(Is_bridge)) ;
memset( Fa, 0 ,sizeof(Fa)) ;
memset(Val,0, sizeof(Val)) ;
memset(Mapp,0,sizeof(Mapp)) ;
Nbridge = Times = 0 ;
for( int i = 0 ; i <= n ; ++i ) {
Map[i].clear() ;
}
}
int tarjan(int u , int fa ) {
Dfn[u] = Low[u] = ++Times ;
for( int i = 0 ; i < Map[u].size() ; ++i ) {
int v =Map[u][i] ;
if(!Dfn[v]){
Fa[v] = u ;
tarjan(v,u) ;
if( Low[v] > Dfn[u] ) {
Nbridge++;
Is_bridge[v] = true ;
}
Low[u] = Low[u] > Low[v] ? Low[v] : Low[u] ;
}
else if( v != fa ) {
Low[u] = Low[u] > Dfn[v] ? Dfn[v] : Low[u] ;
}
}
return Times ;
}
int main() {
while(~scanf("%d%d",&n,&m)&&(n||m)) {
init() ;
int island1 , island2 , people ;
for( int i = 0; i < m ; ++i ) {
scanf("%d%d%d",&island1,&island2,&people) ;
if(!Mapp[island1][island2]){
Map[island1].push_back(island2) ;
Map[island2].push_back(island1) ;
Val[island1][island2] = Val[island2][island1] = people ;
}
Mapp[island1][island2] = Mapp[island2][island1] = true ;
}
int Num = tarjan(1,-1) ;
if( Num < n ) {printf("0\n") ; continue ; }
int Minn = Inf ;
if( !Nbridge ) { printf("-1\n") ;continue ;}
for( int i = 1 ; i <= n ; ++i ) {
if( Is_bridge[i] ) {
Minn = Val[i][Fa[i]] > Minn ? Minn : Val[i][Fa[i]] ;
}
}
if( !Minn ) Minn = 1 ;
printf("%d\n",Minn) ;
}
return 0 ;
}