题意:这题其实就是一个水题 , 可题目条件不清 , 也可能是我们自身的英语水平不行 , 就是要求出一条权值最小的桥。
比赛的时候 , 卡我3个多小时 。 诶 , 真是不可思议。
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 1010
#define min(x,y) (x)<(y)?(x):(y)
#define max(x,y) (x)>(y)?(x):(y)
struct node
{
int u;
int d;
};
vectorgrap[maxn];
int low[maxn] , m , n;
int pre[maxn];
int dfs_clock;
int xy[maxn][maxn];
int minx;
void init()
{
for(int i = 1; i <= n; i++)
grap[i].clear();
dfs_clock = 0;
memset(xy , 0 , sizeof(xy));
memset(pre , 0 , sizeof(pre));
minx = 100000;
}
int dfs(int u)
{
int lowu = low[u] = ++dfs_clock;
int i , lowv;
for(i = 0; i < grap[u].size(); i++)
{
int v = grap[u][i].u;
if(xy[u][v])
{
xy[u][v] -= 1;
xy[v][u] -= 1;
if(!pre[v])
{
pre[v] = 1;
lowv = dfs(v);
lowu = min(lowv , lowu);
if(lowv > low[u])
minx = min(minx , grap[u][i].d);
}
else
lowu = min(lowu , low[v]);
}
}
return lowu;
}
int main()
{
while(scanf("%d %d" , &n , &m) && (n+m))
{
init();
int i , x , y , z;
node e;
for(i = 1; i <= m; i++)
{
scanf("%d %d %d" , &x , &y , &z);
e.u = y , e.d = z ;
grap[x].push_back(e);
e.u = x;
grap[y].push_back(e);
xy[x][y] += 1;
xy[y][x] += 1;
}
int g = 0;
for(i = 1 ; i <= n; i++)
if(!pre[i])
{
g += 1;
if(g > 1)
break;
pre[i] = 1;
dfs(i);
}
if(g > 1)
{
cout<<"0"<<endl;
continue;
}
minx = max(1 , minx);
if(minx == 100000)
cout<<"-1"<<endl;
else cout<<minx<<endl;
}
return 0;
}
比赛的时候 , 卡我3个多小时 。
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 1010
#define min(x,y)
#define max(x,y)
struct node
{
};
vectorgrap[maxn];
int low[maxn] , m , n;
int pre[maxn];
int dfs_clock;
int xy[maxn][maxn];
int minx;
void init()
{
}
int dfs(int u)
{
}
int main()
{
}