参考题解:http://codeforces.com/contest/701/problem/F
感觉这题思路并不难,但是编码不太容易。
思路:
首先判断图的连通性,看S和T是否在同一个连通块里面,如果不在的话,就直接输出结果。如果在一个连通块里面的话,再进行后续的判断。
当S和T连通的时候,求出两点间的一条路径,因为最多只能删除删除两条边,如果有解的话,肯定有一条边在这个路径里。如果S和T只有一条路径,那肯定就是这一条路径,如果S和T有两条不相交的路径,肯定每个路径要删除一条边。如果S和T之间超过两条不相交路径,肯定无解了。
- 先枚举找到这条路径的每条边,如果存在割边的话,就更新答案,枚举完路径上的边之后。然后再枚举删除这条路径的每条边,然后再找一条S和T之间的路径,看这条路径上有没有割边,有的话,就更新答案。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1111;
const int MAXM = 66666;
const int INF = 2e9+10;
int Dfn[MAXN],Low[MAXN];
struct Edge
{
int to,next,w,id;
}edge[MAXM];
int head[MAXN];
bool cut[MAXM],vis[MAXN],isBridge[MAXM];
int s,t,n,m,cnt,tot;
vector<int> path,ans,opath;
void init()
{