题意:~
思路:缩点之后求个最短路
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PI;
typedef pair< PI, int> PII;
#define pb push_back
#define Key_value ch[ch[root][1]][0]
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define MS(x,y) memset(x,y,sizeof(x))
const double eps = 1e-8;
const double pi = acos (-1.0);
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int M = 1000100;
const int MAXN = 3010;
const int MAXM = 10050;
struct Edge
{
int to, next;
} edge[MAXM];
int head[MAXN], tot;
int Low[MAXN], DFN[MAXN], Stack[MAXN], Belong[MAXN];
int Index, top;
int scc;
bool Instack[MAXN];
int num[MAXN];
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void Tarjan(int u, int fa)
{
int v;
Low[u] = DFN[u] = ++Index;
Stack[top++] = u;
Instack[u] = true;
for(int i = head[u]; i != -1; i = edge[i].next)
{
v = edge[i].to;
if(v == fa) continue;
if( !DFN[v] )
{
Tarjan(v, u);
if( Low[u] > Low[v] )Low[u] = Low[v];
}
else if(Instack[v] && Low[u] > DFN[v])
Low[u] = DFN[v];
}
if(Low[u] == DFN[u])
{
scc++;
do
{
v = Stack[--top];
Instack[v] = false;
Belong[v] = scc;
num[scc]++;
}
while( v != u);
}
}
void solve(int N)
{
memset(DFN, 0, sizeof(DFN));
memset(Instack, false, sizeof(Instack));
memset(num, 0, sizeof(num));
Index = scc = top = 0;
for(int i = 1; i <= N; i++)
if(!DFN[i]) Tarjan(i, 0);
}
void init()
{
tot = 0;
memset(head, -1, sizeof(head));
}
struct mmp
{
int v, cost;
mmp(int _v = 0, int _cost = 0): v(_v), cost(_cost) {}
};
vector<mmp>E[MAXN];
void adds(int u, int v, int w)
{
E[u].pb(mmp(v, w));
}
bool vis[MAXN];
int dist[MAXN];
void gg(int start, int n)
{
MS(vis, false);
fill(dist, dist + n + 1, INF);
vis[start] = 1;
dist[start] = 0;
queue<int >que;
while(!que.empty())que.pop();
que.push(start);
while(!que.empty())
{
int u = que.front();
que.pop();
vis[u] = false;
for(auto &i : E[u])
{
int v = i.v;
if(dist[v] > dist[u] + i.cost)
{
dist[v] = dist[u] + i.cost;
if(!vis[v])
{
vis[v] = true;
que.push(v);
}
}
}
}
}
int du[3050];
int main()
{
int n;
cin >> n;
init();
int u, v;
for(int i = 0; i < n; ++i)
{
scanf("%d%d", &u, &v);
addedge(u, v);
addedge(v, u);
}
solve(n);
int st;
for(int i = 1; i <= n; ++i)
{
du[Belong[i]]++;
if(du[Belong[i]] > 1)
{
st = Belong[i];
break;
}
}
for(int i = 1; i <= n; ++i)
{
for(int j = head[i]; ~j; j = edge[j].next)
{
if(Belong[edge[j].to] != Belong[i])
adds(Belong[i], Belong[edge[j].to], 1);
}
}
gg(st, n);
for(int i = 1; i <= n; ++i) cout << dist[Belong[i]] << (i == n ? "\n" : " ");
return 0;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1376 (转载时请注明本文出处及文章链接)


发表评论
快来吐槽一下吧!